至少有一个JAR文件被扫描以查找TLD(标签库描述符),但未包含任何TLD。

69

我在Tomcat 7.30(Eclipse Juno)上一直得到这个错误:

至少有一个JAR被扫描以查找TLD,但未包含任何TLD。启用此日志记录器的调试日志记录可获取未在其中找到TLD的JAR列表。在扫描期间跳过不需要的JAR可以改善启动时间和JSP编译时间。

我打开了conf\logging.properties文件,将所有的INFO修改为FINE并取消注释该行。

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

我仍然看到至少扫描了一个JAR文件以查找TLD,但不包含TLD。启用调试日志记录...

所以我应该怎么做才能看到这些jar?

日志位置:

Tomcat日志位于$CATALINA_HOME\logs\catalina.yyyy-mm-dd.log。Eclipse会在控制台中打印它们 - 如果您想要在控制台记录,您必须进行以下操作:

在服务器选项卡中,双击Tomcat服务器。你将得到一个名为“概述”的屏幕。单击“打开启动配置”。单击“常规”选项卡。屏幕底部可以勾选“文件”复选框,然后指定可用于记录控制台(catalina.out)输出的文件。最后,重新启动Tomcat服务器。


以上日志信息的完整日志行是什么?包括时间戳,记录器等。 - Christopher Schultz
@Christopher:可能是Eclipse的问题 - 当我手动运行应用程序时,我可以在弹出的控制台中看到日志。但是无法找到实际的日志文件 - 如果您知道它们在哪里,那就太好了。一旦我完全搞清楚了,我会回复的。 - Mr_and_Mrs_D
Eclipse真是太麻烦了,我也遇到了同样的问题。 - Bilbo Baggins
对于Tomcat 9,请参阅https://stackoverflow.com/questions/40204124/how-to-fix-jars-that-were-scanned-but-no-tlds-were-found-in-them-in-tomcat-9 - undefined
8个回答

28
如果想要读取conf\logging.properties文件必须(参见此处)将该文件转储到Servers\Tomcat v7.0 Server at localhost-config\文件夹中,然后在使用的启动配置的VM参数中添加以下行:

-Djava.util.logging.config.file="${workspace_loc}\Servers\Tomcat v7.0 Server at localhost-config\logging.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

这可能需要重启一两次(或不需要),但最终我在控制台上看到了鲜红色的输出:

FINE: 在[file:/C:/Dropbox/eclipse_workspaces/javaEE/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ted2012/WEB-INF/lib/logback-classic-1.0.7.jar]中未找到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/catalina.properties文件中的tomcat.util.scan.DefaultJarScanner.jarsToSkip或org.apache.catalina.startup.TldConfig.jarsToSkip属性中。//等等。编辑:根据@Stephan的评论:“每次对JSP文件进行更改时,都会出现FINE警告”。
奖励:为了消除警告,请在中添加以下内容:
# Additional JARs (over and above the default JARs listed above) to skip when
# scanning for TLDs. The list must be a comma separated list of JAR file names.
org.apache.catalina.startup.TldConfig.jarsToSkip=logback-classic-1.0.7.jar,\
joda-time-2.1.jar,joda-time-2.1-javadoc.jar,mysql-connector-java-5.1.24-bin.jar,\
logback-core-1.0.7.jar,javax.servlet.jsp.jstl-api-1.2.1.jar

2
每次在JSP文件中进行更改时,都会出现FINE警告。 - Stephan
你可以清理Tomcat(删除已编译的JSP文件),重新编译将触发消息。这个catalina.properties设置对我不起作用——可能是我的Tomcat版本——7.0.27,尽管现有的属性文件已经有了tomcat..util.scan.DefaultJarScanner.jarsToSkip=x.y.z - Adam
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar - Zhang Buzz
这个解释最有帮助的是与@mhmuftee的答案一起详细说明要激活哪个记录器:org.apache.jasper.servlet.TldScanner.level = FINE(至少适用于Tomcat 8.x(?))。 - fheub

16

(Tomcat 8.0.28) 上述方法对我没有起作用,这是实际有效的方式:

  1. Add this line to the end of your {CATALINA-HOME}/conf/logging.properties:

    org.apache.jasper.level = FINEST
    
  2. Shut down the server (if started).

  3. Open console and run (in case of Windows):

    %CATALINA_HOME%\bin\catalina.bat run
    
  4. Enjoy logs, e.g. (again, for Windows):

    {CATALINA-HOME}/logs/catalina.2015-12-28.log
    

我放弃了将其与Eclipse启动配置集成,因此请注意,这仅从控制台运行时有效,在Eclipse中启动服务器不会产生额外的日志消息。


9

apache-tomcat-8.0.33

如果您想在Tomcat中为TLD扫描的JAR启用调试日志记录,则需要更改Tomcat目录下的/conf/logging.properties文件。< br/>

取消以下行的注释:
org.apache.jasper.servlet.TldScanner.level = FINE

FINE级别是用于调试日志的。

这对于普通Tomcat应该可以工作。

如果Tomcat在Eclipse下运行。那么您需要在Eclipse中设置tomcat logging.properties的路径。

  1. 在Eclipse中打开servers视图。停止服务器。双击Tomcat服务器。
    这将为服务器打开Overview窗口。
  2. 单击Open launch configuration。这将打开另一个窗口。
  3. 转到Arguments选项卡(第二个选项卡)。转到VM arguments部分。
  4. 将以下两行粘贴到此处:-
    -Djava.util.logging.config.file="{CATALINA_HOME}\conf\logging.properties"
    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
    这里的CATALINA_HOME是PC上对应的Tomcat服务器目录。
  5. 保存更改。重新启动服务器。

现在扫描TLD的JAR文件应该显示在日志中。


1
对于Tomcat 9,我发现这个最有帮助。顶部的回复对此处提到的第一步不清楚。另外,使用日志中提到的指定属性jarsToSkip,而不是这里提到的属性。 - gagarwa

4

(Tomcat 7.0.32)

我在启用tomcat/conf/logging.properties文件中的TldLocationsCache行时遇到了查看调试信息的问题。我只能看到一个警告,但无法看到哪些库已被扫描。我尝试了更改每个日志级别并尝试了一切,但没有运气。然后我进入了单独调试模式(即逐个删除、清除安装等),最终发现了原因。

我的Web应用程序有一个自定义的tomcat/webapps/mywebapp/WEB-INF/classes/logging.properties文件。我将TldLocationsCache行复制到此文件中,最终可以看到jar文件名。

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


1
@Mr_and_Mrs_D - 尝试将调试级别设置为everything。我在这里写了一份指南(https://dev59.com/VWAf5IYBdhLWcg3wSRAz#32455927) - tekNorah
这是Tomcat 7的正确答案,几乎是的。在logging.properties文件中取消注释“org.apache.jasper.compiler.TldLocationsCache.level = FINE”。然后清空/work文件夹中编译的jsps。消息在日期日志文件中,例如catalina.2018-09-26.log。 - mwarren

2

如果您正在使用Sysdeo Eclipse Tomcat插件并尝试让其正常工作,请按照以下步骤进行操作(我使用了Sysdeo Tomcat插件3.3.0版本,Eclipse Kepler和Tomcat 7.0.53来构建这些步骤):

  1. 窗口-->首选项-->在树中展开Tomcat节点-->JVM设置
  2. 在“追加到JVM参数”下,单击“添加”按钮。
  3. 在“新的Tomcat JVM参数”弹出窗口中,输入-Djava.util.logging.config.file="{TOMCAT_HOME}\conf\logging.properties",其中{TOMCAT_HOME}是您的Tomcat目录的路径(例如:C:\Tomcat\apache-tomcat-7.0.53\conf\logging.properties)。 点击“确定”。
  4. 在“追加到JVM参数”下,再次单击“添加”按钮。
  5. 在“新的Tomcat JVM参数”弹出窗口中,输入-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager。点击“确定”。
  6. 单击“首选项”窗口中的“确定”按钮。
  7. 按照上述问题中指定的方式对{TOMCAT_HOME}\conf\logging.properties文件进行调整。
  8. 下次在Eclipse中启动Tomcat时,您应该可以在Eclipse控制台中看到扫描的.jars列表,而不是“为此记录器启用调试日志记录”消息。相应信息也会被记录在{TOMCAT_HOME}\logs\catalina.yyyy-mm-dd.log中。

0

我的设置:

  • Eclipse 2022-06
  • 嵌入式Tomcat服务器8.5
  • log4j2
  • Vaadin 23.2.3(纯Spring MVC,不使用Spring Boot)

要在log4j2中启用JarScanner日志记录:

  1. 在服务器命令行上定义日志管理器为log4j2 LogManager:

    -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager 
    
  2. 将所需的log4j2 jars包含在服务器引导类路径中(“用户条目”部分):log4j-api-*.jar,log4j-core-*.jar,log4-jul-*.jar

  3. 将log4j配置文件所在的资源路径包含在服务器引导类路径中(“用户条目”部分)

  4. 在您的配置文件中定义记录器级别:

   <logger name="org.apache.jasper.servlet.TldScanner">
      <level value="TRACE" />
   </logger>

顺便说一句:在Vaadin项目中根本不需要进行TLD扫描。请参阅this topic中的详细讨论。对于我的设置,只有编辑catalina.properties才能产生所需的效果(即根本不进行TLD扫描):

  • jarsToSkip:添加*.jar
  • jarsToScan:添加flow-server-*.jar和vaadin-dev-server-*.jar

这两个Vaadin库必须被扫描,以便Tomcat找到基本的servlet配置(Vaadin的AppShellConfiguratorVaadinMVCWebAppInitializer的具体派生)。

此外,我在Eclipse项目的配置中取消了“JavaServer Faces”Facet的选择(但我不确定是否产生了影响。在Eclipse重新启动后,此复选框又被激活了)。


-1

对我来说,当将geoserver WAR部署到Tomcat 7时,出现了问题。

为了解决这个问题,我从Java 7升级到了Java 8。

这是在Docker容器下运行的。Tomcat 7.0.75+Java 8+Geos 2.10.2


1
我仍然在Java 11中看到这行代码。 - BairDev

-1

我曾经遇到过同样的问题。 这个问题与Tomcat有关。 我通过删除Tomcat和添加Tomcat来解决了这个问题。 现在它已经正常工作了。


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - abbasdgr8

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