[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.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.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); } }; }
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