【问题标题】:Upgrade from Tomcat 8.0.39 to 8.0.41 results in 'failed to scan' errors从 Tomcat 8.0.39 升级到 8.0.41 会导致“扫描失败”错误
【发布时间】:2017-07-08 20:52:23
【问题描述】:

我有一个 Spring Boot WAR 应用程序在 AWS 上的 Tomcat 8.0.39 下完美运行。发出sudo service tomcat8 stop,通过sudo yum update 升级到Tomcat 8.0.41,并重启实例后,应用程序没有启动。在 catalina 日志文件中,我看到了大量的异常类型:

19-Feb-2017 10:27:15.326 WARNING [localhost-startStop-1] org.apache.tomcat.util.
scan.StandardJarScanner.scan Failed to scan [file:/usr/share/java/tomcat8/javax.
annotation-api.jar] from classloader hierarchy
 java.io.FileNotFoundException: /usr/share/java/tomcat8/javax.annotation-api.jar
 (No such file or directory)

以下是 Tomcat 抱怨的文件:

javax.annotation-api.jar
jsr181-api.jar
jaxb-api.jar
javax.xml.soap-api.jar
FastInfoset.jar
mimepull.jar
saaj-impl.jar
stax2-api.jar
woodstox-core-asl.jar
jaxb-core-2.2.10-b140802.1033.jar
jaxb-api-2.2.12-b140109.1041.jar
istack-commons-runtime-2.19.jar
txw2-2.2.10-b140802.1033.jar
hk2-core.jar
class-model.jar
config.jar
auto-depends.jar
javax.inject.jar
hk2-api.jar
osgi-resource-locator.jar
tiger-types.jar
bean-validator.jar
jtype.jar

关于如何解决此问题的任何建议?


更新 #1:

上面的一些文件属于jaxws-ri。事实证明,我将 JAX-WS RI 2.2.10 lib 目录中的一些 (10) 但不是全部 (23) jar 复制到了 Tomcat 的 lib 目录中。复制丢失的 13 个 jar 后,Tomcat 在 catalina 日志文件中抱怨的文件列表已缩小为:

jaxb-core-2.2.10-b140802.1033.jar
jaxb-api-2.2.12-b140109.1041.jar
istack-commons-runtime-2.19.jar
txw2-2.2.10-b140802.1033.jar
hk2-core.jar
class-model.jar
config.jar
auto-depends.jar
javax.inject.jar
hk2-api.jar
osgi-resource-locator.jar
tiger-types.jar
bean-validator.jar
jtype.jar

(上述文件的异常在日志文件中重复多次。看起来扫描器在启动时被重复调用,可能扫描不同的类路径。)

这告诉我,随着从 8.0.39 到 8.0.41 的转换,Tomcat 突然对所有引用的 jar 的存在变得非常挑剔,即使应用程序在没有很多引用的情况下也能正常工作。此外,Tomcat 似乎对某些 jar 的特定构建非常挑剔(例如,参见上面的 jaxb-core...jaxb-api... jar)。

现在,为了解决这个问题,我可以尝试找到所有这些丢失的 jar 并将它们复制到 Tomcat 的 lib 目录。但是,由于通用名称(例如 config.jar)或缺少版本号,我认为无法确保其中一些的正确来源。

那么,有没有办法防止 Tomcat 的 scan.StandardJarScanner.scan 对所有这些 jars 如此挑剔?


更新 #2:

原来在Tomcat 8.0.38中,增加了一个设置来控制jar扫描,其值默认为true。要关闭扫描,请在context.xml 中添加以下行:

<Context>
  ...
  <JarScanner scanManifest="false"/>
</Context>

详情见 Provide an option to disable processing of Class-Path entry in a jar's manifest file.

【问题讨论】:

  • 文件不存在。如果 Tomcat 8.0.41 需要它们(而 8.0.39 显然不需要),那么它们应该带有 yum update 但显然它们没有。
  • 所以从rpm -ql tomcat|more 开始,看看安装了什么,并确保文件确实丢失了,而不是意外。

标签: java file tomcat jar upgrade


【解决方案1】:

存在一个错误,即 Tomcat 8 会忽略 JAR 的 MANIFEST.MF 文件中的 Class-Path 标头,请参阅 Bug 59226

错误 59226 - StandardJarScanner 忽略清单类路径标头中的 jar

此错误已在 Tomcat 8.0.34 中修复,但它会针对不需要的 JAR 产生大量警告,请参阅 Bug 59961

错误 59961 - 提供一个选项以禁用处理 jar 清单文件中的类路径条目

从 Tomcat 8.0.38 开始,您可以禁用对MANIFEST.MF 文件的扫描,请参阅The Jar Scanner Component

扫描清单

如果为 true,则将扫描找到的任何 JAR 的清单文件以查找其他类路径条目,并将这些条目添加到要扫描的 URL 中。默认为真。

【讨论】:

    【解决方案2】:

    您可以添加以下行

    我遇到了同样的问题

    server.tomcat.additional-tld-skip-patterns=*.jar

    在 application.properties 文件中

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 1970-01-01
      • 2014-04-29
      • 2013-05-27
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2019-10-26
      • 2018-01-28
      相关资源
      最近更新 更多