diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactory.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactory.java index 4351a6359e..6e1730d147 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactory.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactory.java @@ -223,6 +223,7 @@ public class JettyServletWebServerFactory extends AbstractServletWebServerFactor Configuration[] configurations = getWebAppContextConfigurations(context, initializersToUse); context.setConfigurations(configurations); + context.setThrowUnavailableOnStartupException(true); configureSession(context); postProcessWebAppContext(context); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyWebServer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyWebServer.java index 6c097fc6c4..e4dfe79798 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyWebServer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyWebServer.java @@ -107,7 +107,7 @@ public class JettyWebServer implements WebServer { this.server.start(); this.server.setStopAtShutdown(false); } - catch (Exception ex) { + catch (Throwable ex) { // Ensure process isn't left running stopSilently(); throw new WebServerException("Unable to start embedded Jetty web server", diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java index 2cb9b4381b..69bb99fc6e 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactoryTests.java @@ -20,9 +20,13 @@ import java.net.InetAddress; import java.nio.charset.Charset; import java.time.Duration; import java.util.Arrays; +import java.util.Collection; import java.util.Locale; import java.util.Map; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + import org.apache.jasper.servlet.JspServlet; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; @@ -41,6 +45,7 @@ import org.mockito.InOrder; import org.springframework.boot.web.server.PortInUseException; import org.springframework.boot.web.server.Ssl; +import org.springframework.boot.web.server.WebServerException; import org.springframework.boot.web.servlet.server.AbstractServletWebServerFactory; import org.springframework.boot.web.servlet.server.AbstractServletWebServerFactoryTests; @@ -296,6 +301,42 @@ public class JettyServletWebServerFactoryTests .isEqualTo(localhost.getHostAddress()); } + @Test + public void faultyListenerCausesStartFailure() throws Exception { + JettyServletWebServerFactory factory = getFactory(); + factory.addServerCustomizers(new JettyServerCustomizer() { + + @Override + public void customize(Server server) { + Collection contexts = server.getBeans(WebAppContext.class); + contexts.iterator().next().addEventListener(new ServletContextListener() { + + @Override + public void contextInitialized(ServletContextEvent sce) { + throw new RuntimeException(); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + + } + + }); + } + + }); + this.thrown.expect(WebServerException.class); + JettyWebServer jettyWebServer = (JettyWebServer) factory.getWebServer(); + try { + jettyWebServer.start(); + } + finally { + QueuedThreadPool threadPool = (QueuedThreadPool) jettyWebServer.getServer() + .getThreadPool(); + assertThat(threadPool.isRunning()).isFalse(); + } + } + @Override protected JspServlet getJspServlet() throws Exception { WebAppContext context = (WebAppContext) ((JettyWebServer) this.webServer)