我 将 Spring Boot 从1.2.0 升级 到 1.5.2 。
之后 即升级,Tomcat的 8.5 抛出 FileNotFoundException异常 时 启动 。
下面是 一个 这些例外,它是投掷 超过10〜更多类似 的异常。
我不知道这些jar的 用途 ,换句话说,我没有<dependency>在 pom.xml中 添加这些jar 。
<dependency>
INFO: Starting Servlet Engine: Apache Tomcat/8.5.11 Apr 06, 2017 3:53:57 PM org.apache.tomcat.util.scan.StandardJarScanner scan WARNING: Failed to scan [file:/C:/Users/myname/.m2/repository/com/sun/xml/ws/jaxws-rt/2.1.7/jaxws-api.jar] from classloader hierarchy java.io.FileNotFoundException: C:\Users\myname\.m2\repository\com\sun\xml\ws\jaxws-rt\2.1.7\jaxws-api.jar (The system cannot find the file specified) at java.util.zip.ZipFile.open(Native Method) at java.util.zip.ZipFile.<init>(ZipFile.java:219) at java.util.zip.ZipFile.<init>(ZipFile.java:149) at java.util.jar.JarFile.<init>(JarFile.java:166) at java.util.jar.JarFile.<init>(JarFile.java:130) at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:60) at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:48) at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:338) at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:288) at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:101) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5178) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)
任何帮助,将不胜感激。
根本原因:
根据 Tomcat Wiki ,Servlet 3.0规范要求在服务器启动期间进行Jar扫描。
Tomcat正在使用org.apache.tomcat.util.scan。为此目的使用StandardJarScanner。
来自 StandardJarScanner 的javadoc 。
默认的JarScanner实现 扫描WEB-INF / lib 目录,然后 扫描 提供的类加载器,然后处理类加载器层次结构。此实现足以 满足Servlet 3.0规范的要求, 并提供许多Tomcat特定的扩展。扩展名是: 扫描类加载器层次结构(默认情况下启用)测试所有文件以查看它们是否为JAR(默认情况下禁用) 测试所有目录以查看它们是否是分解的JAR(默认情况下处于禁用状态) 所有扩展 都可以通过配置来控制 。
默认的JarScanner实现 扫描WEB-INF / lib 目录,然后 扫描 提供的类加载器,然后处理类加载器层次结构。此实现足以 满足Servlet 3.0规范的要求, 并提供许多Tomcat特定的扩展。扩展名是:
扫描类加载器层次结构(默认情况下启用)测试所有文件以查看它们是否为JAR(默认情况下禁用)
测试所有目录以查看它们是否是分解的JAR(默认情况下处于禁用状态)
所有扩展 都可以通过配置来控制 。
解决方案1:特定于Spring Boot。
我们可以 禁用 此jar扫描。
我通过在application-xxx.properties文件中添加以下属性来禁用它。该属性是 特定于Spring Boot的 。
# Comma-separated list of additional patterns that match jars to ignore for TLD scanning. server.tomcat.additional-tld-skip-patterns=*.jar
你可以找到 从Tomcat相似的特性 在这里。
这些属性可用于配置 传统的 tomcat( 非 Spring Boot)应用程序。
解决方案2:特定于Spring
您可以按以下方式禁用 清单 文件的JarScanner 。
@Bean public EmbeddedServletContainerFactory embeddedServletContainerFactory() { return new TomcatEmbeddedServletContainerFactory() { @Override protected void postProcessContext(Context context) { ((StandardJarScanner) context.getJarScanner()).setScanManifest(false); } }; }
解决方案3:传统的独立Tomcat:
<Context> ... <JarScanner scanManifest="false"/> ... </Context>
请参阅: Jar扫描仪组件 。