从Tomcat 8.0.39升级到8.0.41会导致“无法扫描”错误
我有一个Spring Boot WAR应用程序在AWS上的Tomcat 8.0.39下完美地工作。 发出sudo service tomcat8 stop
,通过sudo yum update
升级到Tomcat 8.0.41,并重启实例,应用程序无法启动。 在catalina日志文件中,我看到了大量类型的exception:
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
。 事实certificate,我将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...
jars)。
现在,为了解决这个问题,我可以尝试找到所有这些丢失的jar并将它们复制到Tomcat的lib
目录中。 但是,由于通用名称(例如config.jar
)或缺少版本号,我认为无法确保其中某些源的正确来源。
那么,有没有办法阻止Tomcat的scan.StandardJarScanner.scan
对所有这些jar子如此挑剔?
更新#2:
事实certificate,在Tomcat 8.0.38中,添加了一个设置来控制jar扫描,其值默认为true
。 要关闭扫描,请在context.xml
添加以下行:
...
有关详细信息,请参阅提供选项以禁用jar清单文件中的Class-Path条目的处理 。
有一个错误,Tomcat 8忽略了JAR的MANIFEST.MF
文件中的Class-Path
标头,请参阅错误59226 :
错误59226 – StandardJarScanner忽略清单Class-path标头中的jar
使用Tomcat 8.0.34修复了此错误,但它为不需要的JAR生成了很多警告,请参阅错误59961 :
错误59961 – 提供禁用jar清单文件中Class-Path条目处理的选项
从Tomcat 8.0.38开始,您可以禁用MANIFEST.MF
文件的扫描,请参阅Jar扫描器组件 :
scanManifest
如果为true,则将扫描找到的任何JAR的Manifest文件以获取其他类路径,并将这些条目添加到要扫描的URL中。 默认值为true。