Как использовать Spring WebApplicationInitializer в Jetty 9.4? - PullRequest
0 голосов
/ 12 июля 2019

У нас есть приложение Java, которое загружается с помощью Spring WebApplicationInitializer на Jetty 9.2:

2019-07-11 09:52:18.464:INFO:oejs.Server:main: jetty-9.2.17.v20160517
2019-07-11 09:52:18.487:INFO:oejs.AbstractNCSARequestLog:main: Opened /apps/jetty/servers/erti/logs/2019_07_10.request.log
2019-07-11 09:52:18.491:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/apps/jetty/servers/erti/contexts/] at interval 1
2019-07-11 09:52:18.522:INFO:oejsh.ContextHandler:main: Started o.e.j.s.h.ContextHandler@446e7065{/hb,null,AVAILABLE}
2019-07-11 09:52:25.437:INFO:/services/information-requests:main: 1 Spring WebApplicationInitializers detected on classpath
2019-07-11 09:52:26.694:INFO:/services/information-requests:main: Initializing Spring root WebApplicationContext

Однако, если мы обновимся до Jetty 9.4, WebApplicationInitializer не будет поднят, и каждая страница получит 404 (хотя статические ресурсы все еще видны):

2019-07-11 09:55:22.915:WARN:oejx.XmlConfiguration:main: Property 'jetty.deploy.monitoredDirName' is deprecated, value from 'jetty.deploy.monitoredDir' used
2019-07-11 09:55:22.956:WARN:oejx.XmlConfiguration:main: Property 'jetty.port' is deprecated, value from 'jetty.http.port' used
2019-07-11 09:55:22.988:WARN:oejx.XmlConfiguration:main: Property 'jetty.keystore.password' is deprecated, use 'jetty.sslContext.keyStorePassword' instead
2019-07-11 09:55:22.990:WARN:oejx.XmlConfiguration:main: Property 'jetty.keymanager.password' is deprecated, use 'jetty.sslContext.keyManagerPassword' instead
2019-07-11 09:55:22.990:WARN:oejx.XmlConfiguration:main: Property 'jetty.truststore.password' is deprecated, use 'jetty.sslContext.trustStorePassword' instead
2019-07-11 09:55:23.069:INFO:oejs.Server:main: jetty-9.4.11.v20180605; built: 2018-06-05T18:24:03.829Z; git: d5fc0523cfa96bfebfbda19606cad384d772f04c; jvm 1.8.0_172-b11
2019-07-11 09:55:23.089:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///apps/jetty/servers/erti/contexts/] at interval 1
2019-07-11 09:55:23.131:INFO:oejsh.ContextHandler:main: Started o.e.j.s.h.ContextHandler@191c6e13{/hb,null,AVAILABLE}

Существует ли какой-либо конкретный модуль Jetty, который нам нужно включить для получения ServletContainerInitializer экземпляров? У меня сложилось впечатление, что ServletContainerInitializer является довольно стандартным начиная с Servlet 3.0, а Jetty 9.4 использует 3.1. Или, может быть, нужно что-то еще, чтобы инициализатор контейнера Spring обнаружил наш WebApplicationInitializer?

Jetty 9.4 сообщает следующее:

Enabled Modules:
================
    0) mail            transitive provider of mail for jndi
    1) resources       ${jetty.base}/start.d/start.ini
    2) threadpool      transitive provider of threadpool for server
                       init template available with --add-to-start=threadpool
    3) server          transitive provider of server for http
                       transitive provider of server for plus
                       transitive provider of server for ssl
                       transitive provider of server for security
                       transitive provider of server for servlet
                       transitive provider of server for requestlog
                       transitive provider of server for jndi
                       init template available with --add-to-start=server
    4) jndi            transitive provider of jndi for plus
    5) security        transitive provider of security for webapp
                       transitive provider of security for plus
    6) transactions    transitive provider of transactions for plus
    7) servlet         transitive provider of servlet for webapp
                       transitive provider of servlet for jsp
    8) webapp          transitive provider of webapp for plus
                       transitive provider of webapp for deploy
                       init template available with --add-to-start=webapp
    9) plus            transitive provider of plus for annotations
   10) annotations     ${jetty.base}/start.d/start.ini
   11) apache-jsp      transitive provider of apache-jsp for jsp
   12) console-capture ${jetty.base}/start.d/start.ini
   13) deploy          ${jetty.base}/start.d/start.ini
   14) http            ${jetty.base}/start.d/start.ini
   15) ssl             transitive provider of ssl for https
                       init template available with --add-to-start=ssl
   16) https           ${jetty.base}/start.d/start.ini
   17) jsp             ${jetty.base}/start.d/start.ini
   18) requestlog      ${jetty.base}/start.d/start.ini

И наше приложение разворачивается с использованием файла контекста Jetty:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/services/information-requests</Set>
  <Set name="war"><Property name="jetty.base" default="."/>/webapps/erti.war</Set>
  <Set name="extraClasspath">/apps/config/erti/</Set>
  <!-- Turn off JSESSIONID appearing in URL-->
  <Call name="setInitParameter">
    <Arg>org.eclipse.jetty.servlet.SessionIdPathParameterName</Arg>
    <Arg>none</Arg>
  </Call>
</Configure>

1 Ответ

0 голосов
/ 12 июля 2019

Я нашел проблему. Наш web.xml не был обновлен и все еще был настроен для версии 2.4 веб-приложения. Поведение Jetty было изменено в https://github.com/eclipse/jetty.project/issues/1466, поэтому он больше не ищет ServletContainerInitializer с версиями веб-приложений ниже 2.5.

...