从Spring Boot 1.2升级到1.5.2之后,在Tomcat 8.5启动过程中出现FileNotFoundException [英] AFTER upgrade from Spring boot 1.2 to 1.5.2, FileNotFoundException during Tomcat 8.5 Startup

查看:319
本文介绍了从Spring Boot 1.2升级到1.5.2之后,在Tomcat 8.5启动过程中出现FileNotFoundException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

升级了春季 Boot 从1.2.0升级到 1.5.2 .

I upgraded Spring Boot from 1.2.0 to 1.5.2.

升级后,Tomcat 8.5 启动期间抛出 FileNotFoundException .

After that upgrade, Tomcat 8.5 is throwing FileNotFoundException during startup.

以下是这些异常中的之一,它抛出了超过10个类似的异常.

Below is one of those exceptions, It is throwing more than ~10 similar exceptions.

我不知道这些罐子的用途,换句话说,我没有在 pom.xml中为这些罐子添加<dependency>.

I have no idea about the purpose of these jars, In other words, I didn't add <dependency> for these jars in pom.xml.

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扫描.

As per Tomcat Wiki, Servlet 3.0 specification requires Jar scanning during server startup.

Tomcat正在使用org.apache.tomcat.util.scan.

Tomcat is using org.apache.tomcat.util.scan.StandardJarScanner for this purpose.

来自 StandardJarScanner 的Javadoc.

From the javadoc of StandardJarScanner.

JarScanner的默认实现扫描WEB-INF/lib 目录 接下来是提供的类加载器,然后处理类加载器 等级制度.此实现足以满足要求 Servlet 3.0规范,并提供了许多 Tomcat特定的扩展.扩展名是:

The default JarScanner implementation scans the WEB-INF/lib directory followed by the provided classloader and then works up the classloader hierarchy. This implementation is sufficient to meet the requirements of the Servlet 3.0 specification as well as to provide a number of Tomcat specific extensions. The extensions are:

  • 扫描类加载器层次结构(默认情况下启用)测试所有文件以查看它们是否为JAR(默认情况下禁用)

  • Scanning the classloader hierarchy (enabled by default) Testing all files to see if they are JARs (disabled by default)

测试所有目录以查看它们是否是分解的JAR(默认情况下处于禁用状态)

Testing all directories to see if they are exploded JARs (disabled by default)

所有扩展名都可以通过配置进行控制.

解决方案1:特定于Spring Boot.

我们可以禁用此罐子扫描.

我通过在application-xxx.properties文件中添加以下属性来禁用它.此属性为 特定于Spring Boot .

I disabled it by adding below property in application-xxx.properties file. This property is Spring Boot specific.

# Comma-separated list of additional patterns that match jars to ignore for TLD scanning.    
server.tomcat.additional-tld-skip-patterns=*.jar

您可以在Tomcat中找到相似的属性

You can find similar properties from Tomcat here.

这些属性可用于配置传统 Tomcat(-弹簧启动)应用程序.

These properties can be used to configure traditional tomcat (non-spring boot) applications.

解决方案2:特定于春季

您可以按以下方式为清单文件禁用JarScanner.

You can disable the JarScanner for manifest files as below.

@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扫描仪组件 > .

Refer : The Jar Scanner Component.

这篇关于从Spring Boot 1.2升级到1.5.2之后,在Tomcat 8.5启动过程中出现FileNotFoundException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆