从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。