如何在Tomcat 9.0.0M10中修复“已扫描但未找到TLD的JAR”

2022-09-01 10:41:55

我是Java EE的新手,并试图在ServletContextListener和监听器工作是连接到数据库bla bla 。当我尝试启动服务器(Tomcat 9)时,它卡在:

“信息:至少扫描了一个 JAR 的 TLD,但不包含任何 TLD。为此记录器启用调试日志记录,以获取已扫描但未找到 TLD 的 JAR 的完整列表。在扫描过程中跳过不需要的 JAR 可以缩短启动时间和 JSP 编译时间。

所以我在“日志记录属性文件”中更改了一些属性,如下所示:

    # Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.

2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.

3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.

4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = FINE
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = FINE
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = FINE
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler

# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE

# To see debug messages in TldLocationsCache, uncomment the following line:
org.apache.jasper.compiler.TldLocationsCache.level = FINE
org.apache.jasper.servlet.TldScanner.level = FINE

# To see debug messages for HTTP/2 handling, uncomment the following line:
#org.apache.coyote.http2.level = FINE

# To see debug messages for WebSocket handling, uncomment the following line:
#org.apache.tomcat.websocket.level = FINE

所有答案都是可以接受的。谢谢大家。


答案 1

这不是tomcat中的错误或任何问题。Tomcat 只是通知您,有些 jar 不包含 TLD,您可以将它们添加到扫描程序的跳过列表中以提高启动性能。因此,您有两种选择:

  1. 您可以放心地忽略该提示。但是,如果它惹恼了您,您可以将该特定记录器设置为更高的日志记录级别,从而防止tomcat记录它。只需添加到 logging.properties 的末尾即可。org.apache.jasper.servlet.TldScanner.level = SEVERE

  2. 启用调试日志记录以使 tomcat 列出这些 jar 并将它们添加到跳过列表中。设置:

    org.apache.jasper.compiler.TldLocationsCache.level = FINE
    org.apache.jasper.servlet.TldScanner.level = FINE
    

并将打印的 jars 名称(不带路径)添加到 tomcat_dir/conf/catalina.properties 中tomcat.util.scan.StandardJarScanFilter.jarsToSkip=...


答案 2

无需将日志记录设置为“精细”、“最好”或“全部”以查找要排除的所有 jar。

下面是一个脚本,用于查找所有不包含 TLD 的 jar(更改 TOMCAT_HOME 变量以匹配您的安装),并在表单上输出一个列表

jar1.jar,\
jar2.jar,\
...

可以粘贴到 catalina.properties 中(省略最后一个 ',\'):

#!/bin/sh
TOMCAT_HOME=/opt/tomcat
for i in `find $TOMCAT_HOME -follow -name "*jar"`
do
    jar tvf $i | grep -i tld > /dev/null
    if [ $? -ne 0 ]; then
        echo "$(basename $i),\\"
    fi
done

但是,如果我被正确告知,在tomcat 9中有可能通过更改(在catalina.properties中)排除所有jars:

tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\

tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar

(在下面几行中注释掉列表),然后通过更改来覆盖包含TLD的jar的决定:

tomcat.util.scan.StandardJarScanFilter.jarsToScan=\
log4j-web*.jar,log4j-taglib*.jar,log4javascript*.jar,slf4j-taglib*.jar

并添加通过修改上面的脚本获得的列表,以列出包含 TLD 的 jar:

#!/bin/sh
TOMCAT_HOME=/opt/tomcat
for i in `find $TOMCAT_HOME -follow -name "*jar"`
do
    jar tvf $i | grep -i tld > /dev/null
    if [ $? -eq 0 ]; then
        echo "$(basename $i),\\"
    fi
done

推荐