Search code examples
javajetty-9

How do I use a Spring WebApplicationInitializer in Jetty 9.4?


We have a Java application that loads using a Spring WebApplicationInitializer on 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

However, if we update to Jetty 9.4, the WebApplicationInitializer isn't picked up, and every page gets a 404 (although static assets are still visible):

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}

Is there a specific Jetty module that we need to enable in order to pick up ServletContainerInitializer instances? I was under the impression that ServletContainerInitializer is pretty standard since Servlet 3.0, and Jetty 9.4 uses 3.1. Or perhaps there's something else needed in order to have the Spring container initializer detect our WebApplicationInitializer?

Jetty 9.4 reports the following:

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

And our application is being deployed using a Jetty context file:

<?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>

Solution

  • I found the problem. Our web.xml hadn't been updated, and was still configured with a webapp version of 2.4. Jetty's behavior was changed in https://github.com/eclipse/jetty.project/issues/1466 so that it no longer looks for ServletContainerInitializer with webapp versions below 2.5.