gpt4 book ai didi

java - 从 Tomcat 8.0.39 升级到 8.0.41 导致 'failed to scan' 错误

转载 作者:太空狗 更新时间:2023-10-29 22:55:13 24 4
gpt4 key购买 nike

我有一个在 AWS 上的 Tomcat 8.0.39 下完美运行的 Spring Boot WAR 应用程序。在发出 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 对所有这些 jar 如此挑剔?


更新#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 忽略了 Class-Path MANIFEST.MF 中的 header JAR 文件,请参阅 Bug 59226 :

Bug 59226 - StandardJarScanner ignores jars in manifest Class-path header

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

Bug 59961 - Provide an option to disable processing of Class-Path entry in a jar's manifest file

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

scanManifest

If true, the Manifest files of any JARs found will be scanned for additional class path entires and those entries will be added to the URLs to scan. The default is true.

关于java - 从 Tomcat 8.0.39 升级到 8.0.41 导致 'failed to scan' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42329948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com