如何修复JSP编译器警告:扫描了一个JAR文件以获取TLD文件,但未包含任何TLD文件?

62

当启动应用程序或通过Ant编译JSP时,Tomcat 7 Jasper 抱怨存在不必要或错放的JAR文件。我收到以下信息:

**compile-jsp:**
   [jasper] Jul 31, 2012 7:15:15 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar
   [jasper] INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 

如何在扫描期间跳过不必要的JAR文件以提高Tomcat启动时间和JSP编译时间?

如何启用更好的输出?


6
你能否编辑位于${catalina.home}/conf/logging.properties的文件并将org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level设置为FINE,重新启动Tomcat,然后发布输出内容?Tomcat并未抱怨有多余的JAR包,但是关于缺少TLD定义的问题,调整日志级别会显示更多细节(它将告诉你Tomcat正在查找缺少的TLD,并提供建议来解决你的问题)。 - ThanksForAllTheFish
1
对于像我一样寻找答案的人,请参见@AlekseyNikitenko在下面的回答:https://dev59.com/J2Yq5IYBdhLWcg3wkRco#39358436。请注意行中的反斜杠,没有它们它将无法工作(至少在Tomcat 7上)。 - Benj
10个回答

51

Tomcat 8.5。在位于/conf目录中的catalina.properties文件中设置:

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

或者进入Tomcat的/conf目录中的context.xml文件,并添加:

<JarScanner scanClassPath="false"/>

1
请不要忘记从“tomcat.util.scan.StandardJarScanFilter.jarsToScan=”中删除无用的JAR文件 - 如果不需要,将其留空。 - bebbo
在Tomcat 9中仍存在问题,并且这解决了Tomcat启动时的十分钟“暂停”。试图记住这是为什么?Struts?JSPs?早已被遗忘。非常感谢。 - michaelok

44
对于Tomcat 8,我必须在tomcat/conf/logging.properties中添加以下行,以便Tomcat扫描的jar文件出现在日志中:
org.apache.jasper.servlet.TldScanner.level = FINE

1
来自未来的消息:tomcat7在此,这个设置只需要从默认配置中注释掉即可。 - peterh
1
来自未来的消息:对于Tomcat的后续版本,您可能需要在logging.properties中同时列出上面列出的行和下面的行: org.apache.jasper.servlet.TldScanner.level = FINE - mdahlman

15
上述解决方法对我无效。相反,我只是从logging.properties文件的最后一行中删除了#符号,这样它就可以工作了。
# To see debug messages in TldLocationsCache, uncomment the following line:
org.apache.jasper.compiler.TldLocationsCache.level = FINE
下一步是在catalina.properties文件中的以下行之后添加Tomcat 7正在查找的jar包。
org.apache.catalina.startup.TldConfig.jarsToSkip=

11

如果有人需要帮助,我刚刚将下面输出文件的内容附加到现有的org.apache.catalina.startup.TldConfig.jarsToSkip=条目中。

请注意,/var/log/tomcat7/catalina.out是您的Tomcat日志文件的位置。

egrep "No TLD files were found in \[file:[^\]+\]" /var/log/tomcat7/catalina.out -o | egrep "[^]/]+.jar" -o | sort | uniq | sed -e 's/.jar/.jar,\\/g' > skips.txt
希望这能有帮助。

这是一个很棒的egrep,谢谢你! - tekNorah

8
警告出现是因为Tomcat扫描所有Jars寻找TLDs(标记库定义)。 步骤1: 要查看哪些JAR引发了此警告,请在tomcat/conf/logging.properties中插入以下行。
org.apache.jasper.servlet.TldScanner.level = FINE

现在,您应该能够看到警告,其中详细说明了哪些JAR文件导致了初始警告。 步骤2 由于在扫描期间跳过不需要的JAR文件可以改善启动时间和JSP编译时间,因此我们将在文件中跳过不需要的JARS。这里有两个选项 -
  1. 将所有JAR文件列在下。但是如果您有很多JAR文件或JAR文件不断变化,则可能会变得繁琐。
  2. 或者插入以跳过所有JAR文件
现在,您不应该看到上述警告,如果您有一个相当大的应用程序,它应该为您节省大量部署应用程序的时间。 注意:已在Tomcat8中测试

4
请取消此行的注释(在/conf/logging.properties文件中)。
org.apache.jasper.compiler.TldLocationsCache.level = FINE

Tomcat 7.0.53 中,这对我有用!


4

对于Tomcat 8,我需要在catalina.properties中添加以下行以防止Tomcat扫描的JAR文件:

tomcat.util.scan.StandardJarScanFilter.jarsToSkip=jsp-api.jar,servlet-api.jar

3

以上方法都对我无效(tomcat 7.0.62)……正如Sensei_Shoh所指出的那样,在消息上面查看类,并将其添加到logging.properties中。我的日志如下:

Jan 18, 2016 8:44:21 PM org.apache.catalina.startup.TldConfig execute
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

所以我添加了。
org.apache.catalina.startup.TldConfig.level = FINE

在conf/logging.properties文件中

之后我得到了很多“有问题”的文件,我不再跳过它们(并且恢复了正常的日志记录...)


1
错误信息会显示使用的记录器,因此请设置该记录器的.level属性:
[jasper] Jul 31, 2012 7:15:15 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar

所以记录器是org.apache.jasper.compiler.TldLocationsCache。在您的logging.properties文件中,添加以下行:
org.apache.jasper.compiler.TldLocationsCache.level = FINE

0
如果日志中的额外条目让你感到困扰,但多一秒钟的启动时间并不影响你,只需将以下内容添加到你的logging.properties文件中即可忘记它:
org.apache.jasper.servlet.TldScanner.level = WARNING

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接