13

在 Arch Linux ARM 上启动 Tomcat 8 时,我收到以下警告:

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

我已经修改了 ${catalina.home}/logging.properties,如下所述:如何修复 JSP 编译器警告:一个 JAR 已扫描 TLD,但不包含 TLD?

我将一些日志记录级别从 INFO 更改为 FINE,取消注释“org.apache.jasper.compiler.TldLocationsCache.level = FINE”并添加“org.apache.jasper.servlet.TldScanner.level = FINE”。所以文件的结尾现在看起来如下:

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-经理].handlers = 4host-manager.org.apache.juli.AsyncFileHandler

# 例如,将 org.apache.catalina.util.LifecycleBase 记录器设置为记录 # 每个扩展 LifecycleBase 的组件更改状态:#org.apache.catalina.util.LifecycleBase.level = FINE

# 要查看 TldLocationsCache 中的调试消息,请取消注释以下行: org.apache.jasper.compiler.TldLocationsCache.level = FINE org.apache.jasper.servlet.TldScanner.level = FINE

但我仍然在启动时收到警告,而不是不需要的 JAR 路径。怎么了?

4

4 回答 4

8

尝试通过以下方式调试所有内容:

  1. 将此添加到logging.properties位于文件的末尾{CATALINA-HOME}/conf

    #To see the most detailed level of logging for all classes, uncomment the following line:
    org.apache.catalina.level=FINEST
    
  2. 重启Tomcat

  3. 从终端运行以下命令以获取需要跳过的 jar 列表(本文由 @joseph-lust 提供

    egrep "No TLD files were found in \[file:[^\]+\]" {CATALINA-HOME}/logs/catalina.out -o | egrep "[^]/]+.jar" -o | sort | uniq | sed -e 's/.jar/.jar,\\/g' > ~/skips.txt
    
  4. skips.txt在您的用户主目录中打开

  5. 将此列表添加到{CATALINA-HOME}/conf/catalina.properties以下行之后:

    org.apache.catalina.startup.TldConfig.jarsToSkip=
    
  6. 完成后确保删除/注释掉它,以防止日志文件变得太大

我仍然不确定为什么会发生这种情况,因为大多数人似乎都可以取消注释该TldLocationsCache行。

于 2015-09-08T10:55:25.517 回答
5

更简单的方法是,在上述帖子的第 1 步中,不要对所有内容启用调试,而是限制为 org.apache.jasper:

用这个:

org.apache.jasper.level = FINEST

而不是这个:

org.apache.catalina.level=FINEST
于 2017-03-31T21:43:04.740 回答
2

我编写了一个脚本来查找所有不包含 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 [ $? -ne 0 ]; then
        echo "$(basename $i),\\"
    fi
done

编辑 TOMCAT_HOME 以匹配您的安装,该脚本在表单上生成一个列表:

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

可以粘贴到 catalina.properties 中:

org.apache.catalina.startup.TldConfig.jarsToSkip=
于 2017-05-29T16:05:41.410 回答
0

原始问题中提到的org.apache.jasper.servlet.TldScanner.level = FINE行应该足以获得不需要的 JAR 路径。据推测,其他一些东西正在阻止日志记录工作。

如果您使用 Eclipse 并在 Servers 选项卡上将 Tomcat 作为服务器运行,则可能需要一些额外的配置才能正确读取logging.properties.

  1. 如果尚未打开服务器选项卡,请打开它(窗口 > 显示视图 > 其他... > 服务器 > 服务器)。如果 Tomcat 服务器正在运行,请停止它。
  2. 在“服务器”选项卡中,双击应调整其日志记录设置的 Tomcat 服务器。这应该会打开服务器的概览选项卡。
  3. 在“常规信息”部分下,单击“打开启动配置”。这应该会弹出“编辑配置”弹出窗口。
  4. 切换到参数选项卡。在 VM 参数部分,附加以下参数,将第一个参数调整为文件路径logging.properties
    • -Djava.util.logging.config.file="C:\REPLACE\WITH\PATH\TO\TOMCAT\conf\logging.properties"
    • -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
  5. 启动 Tomcat 并在控制台中查找类似以下的行:
01-Dec-2020 20:18:32.069 FINE [main] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan No TLD files were found in [file:/C:/projects/so/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/webapps/so_proj/WEB-INF/lib/gson-2.8.1.jar]. Consider adding the JAR to the tomcat.util.scan.StandardJarScanFilter.jarsToSkip property in CATALINA_BASE/conf/catalina.properties file.

感谢Steve Mitchell在这里的回答,它帮助了我。

于 2020-12-02T00:23:06.053 回答