ПОСЛЕ обновления от Spring загрузки 1.2 до 1.5.2, FileNotFoundException во время запуска Tomcat 8.5

Я обновил Spring Boot с 1.2.0 до 1.5.2.

После этого обновления Tomcat 8.5 бросает FileNotFoundException во время запуска.

Ниже приведено одно из этих исключений. Он бросает более 10 подобных исключений.

Я понятия не имею о цели этих банок. Другими словами, я не добавлял <dependency> для этих банок в 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)

Любая помощь будет оценена по достоинству.

Ответ 1

Основная причина:

Согласно Tomcat Wiki, для спецификации Servlet 3.0 требуется сканирование Jar во время запуска сервера.

Tomcat использует org.apache.tomcat.util.scan. StandardJarScanner для этой цели.

Из javadoc StandardJarScanner.

По умолчанию реализация JarScanner сканирует каталог WEB-INF/lib, за которым следует предоставленный загрузчик классов, а затем обрабатывает иерархию загрузчика классов. Эта реализация достаточна для соответствия требованиям спецификации Servlet 3.0, а также для предоставления ряда специальных расширений Tomcat. Расширения:

  • Сканирование иерархии загрузчика классов (включено по умолчанию) Тестирование всех файлов, чтобы узнать, являются ли они JAR (по умолчанию отключен)

  • Тестирование всех каталогов, чтобы увидеть, если они взорваны JAR (отключено по умолчанию)

  • Все расширения можно контролировать с помощью конфигурации.

Решение1: Весенняя загрузка.

Мы можем отключить эту проверку банки.

Я отключил его, добавив ниже свойство в файл application-xxx.properties. Это свойство Spring Spring.

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

Вы можете найти аналогичные свойства из Tomcat здесь.

Эти свойства можно использовать для настройки традиционных приложений tomcat (non -spring).

Решение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 Scanner.