복붙노트

[SPRING] 스프링 부트 1.2에서 1.5.2로 업그레이드 한 후, Tomcat 8.5 시동시 FileNotFoundException을 업그레이드 한 후

SPRING

스프링 부트 1.2에서 1.5.2로 업그레이드 한 후, Tomcat 8.5 시동시 FileNotFoundException을 업그레이드 한 후

나는 Spring Boot를 1.2.0에서 1.5.2로 업그레이드했다.

업그레이드가 끝나면 Tomcat 8.5는 시작 중에 FileNotFoundException을 발생시킵니다.

아래는 이러한 예외 중 하나입니다. 비슷한 예외가 ~ 10 개 이상 발생합니다.

나는이 jar의 목적에 대해 전혀 모른다. 즉, pom.xml에이 jar에 를 추가하지 않았다.

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)

어떤 도움을 주시면 감사하겠습니다.

해결법

  1. ==============================

    1.RootCause :

    RootCause :

    Tomcat Wiki에 따라 서블릿 3.0 사양에서는 서버를 시작하는 동안 Jar 검색이 필요합니다.

    Tomcat은이 목적으로 org.apache.tomcat.util.scan.StandardJarScanner를 사용하고 있습니다.

    StandardJarScanner의 javadoc에서.

    해결책 1 : 특정 스프링 부트.

    우리는이 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에서 비슷한 속성을 찾을 수 있습니다.

    이 속성은 전통적인 바람둥이 (비 스프링 부팅) 응용 프로그램을 구성하는 데 사용할 수 있습니다.

    솔루션 2 : 특정 스프링

    다음과 같이 매니페스트 파일에 대해 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 스캐너 구성 요소.

  2. ==============================

    2.Sundaraj의 발견을 개선하기 위해 ... TLD 스캐닝을 완전히 비활성화하면 JSP / JSTL이 중단됩니다.  지원하다.

    Sundaraj의 발견을 개선하기 위해 ... TLD 스캐닝을 완전히 비활성화하면 JSP / JSTL이 중단됩니다.  지원하다.

    문제는 클래스 경로 자체는 OK입니다. Tomcat만이 각 Jar의 매니페스트 파일을 추가로 스캔하고, Maven을 사용하여 각 Jar가 자체 디렉토리에 있기 때문에 의미없는 경로가 생성됩니다 (아마도 Eclipse에서 실행 중일 수 있습니다).

    따라서 JSP를 JSTL과 함께 계속 사용하려면 매니페스트 검색 만 사용하지 않도록 설정해야합니다.

    Spring Boot 2.0의 경우 응용 프로그램 구성에 다음을 추가하십시오.

      @Bean
      public TomcatServletWebServerFactory tomcatFactory() {
        return new TomcatServletWebServerFactory() {
          @Override
          protected void postProcessContext(Context context) {
            ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
          }
        };
      }
    
  3. from https://stackoverflow.com/questions/43264890/after-upgrade-from-spring-boot-1-2-to-1-5-2-filenotfoundexception-during-tomcat by cc-by-sa and MIT license