При обновлении до Jetty 9.x (с Jetty 6.x) вы также обновили версию поддержки сервлета.
От Servlet 2.5 (в Jetty 6) до Servlet 3.1 (в Jetty 9).
Это означает, что в контейнере теперь есть что делать при запуске веб-приложения.
На вас сейчас воздействует введение javax.servlet.ServletContainerInitializer
(в Servlet 3.0).
Существует множество реализаций ServletContainerInitializer
(SCI), представленных в Jetty 9.x, каждая из которых может объявить необязательный @HandlesTypes
, который будет перечислять, какие виды аннотаций и / или классов интересует SCI. в уведомлении о ServletContainerInitializer.onStartup(Set<Class<?>> c, ServletContext ctx)
. Это означает, что при запуске Jetty должен сканировать классы контейнеров веб-приложения (WEB-INF/classes
и WEB-INF/lib/*.jar
) и jar-контейнеры сервера (Server ClassLoader), чтобы найти все подходящие классы для объявленного @HandlesTypes
.
Это сканирование является требованием Servlet 3.0.
Короче говоря, вы не можете предотвратить расширение файла WAR, если у вас также есть файлы jar в WEB-INF/lib
, так как Java не поддерживает вложенную распаковку файла jar. Иными словами, вы не можете использовать JarFile
для обхода файла JAR, который находится в другом файле JAR. (JarURLConnection
в вашей трассировке стека вызвано вызовом JarURLConnection.getJarFile()
, который позволяет просматривать содержимое файла JAR, необходимое для правильного сканирования байт-кода JAR)
Альтернативный вариант: QuickStart ...
Вы можете использовать быстрый запуск Jetty , предварительно рассчитать сканирование во время сборки и встроить его в файлы war, используя этот сгенерированный быстрый запуск вместо сканирования контента во время выполнения.