Tomcat控制台提示至少有一个JAR被扫描用于TLD但尚未包含TLD

现象

Tomcat控制台提示:

信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。


解决方式

控制台打印的是提示级别的日志,其实描述已经很清楚:项目中存在被用于扫描TLD文件的JAR包,但由于没包含TLD文件,其实是一个白白增加启动时间和JSP编译时间的过程

可见这个日志信息,是一个优化性能的提示,即使不处理也不会有严重的影响。处理步骤:

  1. 找出具体是哪些JAR包,被用于扫描TLD文件但没包含TLD文件

    设置相关日志的打印级别:

    往Tomcat目录下的conf/logging.properties文件中添加内容:org.apache.jasper.servlet.TldScanner.level = FINE。保存后,重启Tomcat,控制台就能将被用于扫描TLD的JAR包打印出来

    例如:

    1
    2
    3
    4
    27-Mar-2022 16:56:04.706 详细 [RMI TCP Connection(4)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在file:/C:/Users/Hunter/IdeaProjects/javaweb-jsp/target/javaweb-jsp-1.0-SNAPSHOT/WEB-INF/lib/jakarta.activation-2.0.0.jar中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。
    27-Mar-2022 16:56:04.769 详细 [RMI TCP Connection(4)-127.0.0.1]
    org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在JAR[file:/C:/Users/Hunter/IdeaProjects/javaweb-jsp/target/javaweb-jsp-1.0-SNAPSHOT/WEB-INF/lib/jakarta.servlet.jsp.jstl-2.0.0.jar]中找到了TLD文件。
    27-Mar-2022 16:56:04.769 详细 [RMI TCP Connection(4)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在file:/C:/Users/Hunter/IdeaProjects/javaweb-jsp/target/javaweb-jsp-1.0-SNAPSHOT/WEB-INF/lib/jakarta.xml.bind-api-3.0.0.jar中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。
  2. 整理涉及的没包含TLD的JAR包,使其跳过扫描

    按照日志的提示,将没包含TLD文件的JAR包添加到Tomcat目录下conf/catalina.properties文件中tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\处,可使用模糊匹配

    1
    2
    3
    4
    5
    6
    # 本例中涉及的不包含TLD文件的都是jakarta开头的JAR包
    # 添加到最后
    tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
    annotations-api.jar,\
    xom-*.jar,\
    jakarta.*.jar
  3. 日志打印出的含有TLD文件的JAR包,如果也能被jarsToSkip的JAR包模糊匹配到需要显式声明扫描该JAR包否则项目运行仍然会报错

    将能被jarsToSkip的JAR包模糊匹配到的,包含TLD文件的JAR包添加到Tomcat目录下conf/catalina.properties文件中tomcat.util.scan.StandardJarScanFilter.jarsToScan=\处,可使用模糊匹配

    1
    2
    3
    4
    5
    6
    7
    8
    # 本例中,涉及的JAR包是 jakarta.servlet.jsp.jstl-2.0.0.jar
    # 添加到最后
    tomcat.util.scan.StandardJarScanFilter.jarsToScan=\
    log4j-taglib*.jar,\
    log4j-web*.jar,\
    log4javascript*.jar,\
    slf4j-taglib*.jar,\
    jakarta.servlet.jsp.jstl-2.0.0.jar
  4. 保存设置,重启Tomcat,控制台不再有该提示。

  5. 最后,记得还原conf/logging.properties文件中对日志打印级别的变更。


参考

彻底解决tomcat控制台提示至少有一个JAR被扫描用于TLD但尚未包含TLD的问题