从 Tomcat 8.0.39 升级到 8.0.41 会导致“扫描失败”错误

2022-09-02 04:24:55

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

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:

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

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的存在变得非常挑剔,即使应用程序在没有很多jar的情况下工作得很好。此外,Tomcat似乎对某些jars的特定构建非常讲究(例如,请参阅上面的和jars)。jaxb-core...jaxb-api...

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

那么,有没有办法防止Tomcat's对所有这些罐子如此挑剔呢?scan.StandardJarScanner.scan


更新 #2:

事实证明,在Tomcat 8.0.38中,添加了一个设置来控制jar扫描,其值默认为。要关闭扫描,请在 中添加以下行:truecontext.xml

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

有关详细信息,请参阅提供禁用 jar 清单文件中类路径条目处理的选项


答案 1

有一个错误,Tomcat 8忽略了MANIFEST中的Class-Path标头 JAR 的 MF 文件,请参阅 Bug 59226

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

此 bug 已在 Tomcat 8.0.34 中修复,但它为不需要的 JAR 生成了很多警告,请参阅 Bug 59961

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

从 Tomcat 8.0.38 开始,您可以禁用文件的扫描,请参阅 Jar 扫描程序组件MANIFEST.MF

scanManifest

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


答案 2

您可以添加以下行

我有同样的问题

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

在应用程序.属性文件中