Support Tomcat 9 and Undertow 2
Closes gh-11749 Closes gh-12243
This commit is contained in:
parent
b4cd4f4c43
commit
45fdf2ffa4
|
|
@ -147,7 +147,7 @@
|
||||||
<selenium.version>3.9.1</selenium.version>
|
<selenium.version>3.9.1</selenium.version>
|
||||||
<selenium-htmlunit.version>2.29.3</selenium-htmlunit.version>
|
<selenium-htmlunit.version>2.29.3</selenium-htmlunit.version>
|
||||||
<sendgrid.version>4.1.2</sendgrid.version>
|
<sendgrid.version>4.1.2</sendgrid.version>
|
||||||
<servlet-api.version>3.1.0</servlet-api.version>
|
<servlet-api.version>4.0.1</servlet-api.version>
|
||||||
<slf4j.version>1.7.25</slf4j.version>
|
<slf4j.version>1.7.25</slf4j.version>
|
||||||
<snakeyaml.version>1.19</snakeyaml.version>
|
<snakeyaml.version>1.19</snakeyaml.version>
|
||||||
<solr.version>7.2.1</solr.version>
|
<solr.version>7.2.1</solr.version>
|
||||||
|
|
@ -175,9 +175,9 @@
|
||||||
<thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
|
<thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
|
||||||
<thymeleaf-extras-data-attribute.version>2.0.1</thymeleaf-extras-data-attribute.version>
|
<thymeleaf-extras-data-attribute.version>2.0.1</thymeleaf-extras-data-attribute.version>
|
||||||
<thymeleaf-extras-java8time.version>3.0.1.RELEASE</thymeleaf-extras-java8time.version>
|
<thymeleaf-extras-java8time.version>3.0.1.RELEASE</thymeleaf-extras-java8time.version>
|
||||||
<tomcat.version>8.5.31</tomcat.version>
|
<tomcat.version>9.0.10</tomcat.version>
|
||||||
<unboundid-ldapsdk.version>4.0.6</unboundid-ldapsdk.version>
|
<unboundid-ldapsdk.version>4.0.6</unboundid-ldapsdk.version>
|
||||||
<undertow.version>1.4.25.Final</undertow.version>
|
<undertow.version>2.0.9.Final</undertow.version>
|
||||||
<webjars-hal-browser.version>3325375</webjars-hal-browser.version>
|
<webjars-hal-browser.version>3325375</webjars-hal-browser.version>
|
||||||
<webjars-locator-core.version>0.35</webjars-locator-core.version>
|
<webjars-locator-core.version>0.35</webjars-locator-core.version>
|
||||||
<wsdl4j.version>1.6.3</wsdl4j.version>
|
<wsdl4j.version>1.6.3</wsdl4j.version>
|
||||||
|
|
|
||||||
|
|
@ -51,14 +51,14 @@ Spring Boot supports the following embedded servlet containers:
|
||||||
|===
|
|===
|
||||||
|Name |Servlet Version
|
|Name |Servlet Version
|
||||||
|
|
||||||
|Tomcat 8.5
|
|Tomcat 9.0
|
||||||
|3.1
|
|4.0
|
||||||
|
|
||||||
|Jetty 9.4
|
|Jetty 9.4
|
||||||
|3.1
|
|3.1
|
||||||
|
|
||||||
|Undertow 1.4
|
|Undertow 2.0
|
||||||
|3.1
|
|4.0
|
||||||
|===
|
|===
|
||||||
|
|
||||||
You can also deploy Spring Boot applications to any Servlet 3.1+ compatible container.
|
You can also deploy Spring Boot applications to any Servlet 3.1+ compatible container.
|
||||||
|
|
|
||||||
|
|
@ -523,6 +523,9 @@ The following Maven example shows how to exclude Tomcat and include Jetty for Sp
|
||||||
|
|
||||||
[source,xml,indent=0,subs="verbatim,quotes,attributes"]
|
[source,xml,indent=0,subs="verbatim,quotes,attributes"]
|
||||||
----
|
----
|
||||||
|
<properties>
|
||||||
|
<servlet-api.version>3.1.0</servlet-api.version>
|
||||||
|
</properties>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
|
@ -541,6 +544,9 @@ The following Maven example shows how to exclude Tomcat and include Jetty for Sp
|
||||||
</dependency>
|
</dependency>
|
||||||
----
|
----
|
||||||
|
|
||||||
|
NOTE: The version of the Servlet API has been overridden as, unlike Tomcat 9 and Undertow
|
||||||
|
2.0, Jetty 9.4 does not support Servlet 4.0.
|
||||||
|
|
||||||
The following Gradle example shows how to exclude Netty and include Undertow for Spring
|
The following Gradle example shows how to exclude Netty and include Undertow for Spring
|
||||||
WebFlux:
|
WebFlux:
|
||||||
|
|
||||||
|
|
@ -727,16 +733,16 @@ To enable that support, your application needs to have two additional dependenci
|
||||||
|
|
||||||
[[howto-configure-http2-tomcat]]
|
[[howto-configure-http2-tomcat]]
|
||||||
==== HTTP/2 with Tomcat
|
==== HTTP/2 with Tomcat
|
||||||
Spring Boot ships by default with Tomcat 8.5.x. With that version, HTTP/2 is only
|
Spring Boot ships by default with Tomcat 9.0.x which supports HTTP/2 out of the box when
|
||||||
supported if the `libtcnative` library and its dependencies are installed on the host
|
using JDK 9 or later. Alternatively, HTTP/2 can be used on JDK 8 if the `libtcnative`
|
||||||
operating system.
|
library and its dependencies are installed on the host operating system.
|
||||||
|
|
||||||
The library folder must be made available, if not already, to the JVM library path. You
|
The library folder must be made available, if not already, to the JVM library path. You
|
||||||
can do so with a JVM argument such as
|
can do so with a JVM argument such as
|
||||||
`-Djava.library.path=/usr/local/opt/tomcat-native/lib`. More on this in the
|
`-Djava.library.path=/usr/local/opt/tomcat-native/lib`. More on this in the
|
||||||
https://tomcat.apache.org/tomcat-8.5-doc/apr.html[official Tomcat documentation].
|
https://tomcat.apache.org/tomcat-9.0-doc/apr.html[official Tomcat documentation].
|
||||||
|
|
||||||
Starting Tomcat 8.5.x without that native support logs the following error:
|
Starting Tomcat 9.0.x on JDK 8 without that native support logs the following error:
|
||||||
|
|
||||||
[indent=0,subs="attributes"]
|
[indent=0,subs="attributes"]
|
||||||
----
|
----
|
||||||
|
|
@ -745,10 +751,6 @@ Starting Tomcat 8.5.x without that native support logs the following error:
|
||||||
|
|
||||||
This error is not fatal, and the application still starts with HTTP/1.1 SSL support.
|
This error is not fatal, and the application still starts with HTTP/1.1 SSL support.
|
||||||
|
|
||||||
Running your application with Tomcat 9.0.x and JDK9 does not require any native library to
|
|
||||||
be installed. To use Tomcat 9, you can override the `tomcat.version` build property with
|
|
||||||
the version of your choice.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[[howto-configure-webserver]]
|
[[howto-configure-webserver]]
|
||||||
|
|
|
||||||
|
|
@ -7409,9 +7409,9 @@ include::{test-examples}/web/client/SampleWebClientTests.java[tag=test]
|
||||||
|
|
||||||
[[boot-features-websockets]]
|
[[boot-features-websockets]]
|
||||||
== WebSockets
|
== WebSockets
|
||||||
Spring Boot provides WebSockets auto-configuration for embedded Tomcat 8.5, Jetty
|
Spring Boot provides WebSockets auto-configuration for embedded Tomcat, Jetty, and
|
||||||
9, and Undertow. If you deploy a war file to a standalone container, Spring Boot assumes
|
Undertow. If you deploy a war file to a standalone container, Spring Boot assumes that the
|
||||||
that the container is responsible for the configuration of its WebSocket support.
|
container is responsible for the configuration of its WebSocket support.
|
||||||
|
|
||||||
Spring Framework provides {spring-reference}web.html#websocket[rich WebSocket support]
|
Spring Framework provides {spring-reference}web.html#websocket[rich WebSocket support]
|
||||||
that can be easily accessed through the `spring-boot-starter-websocket` module.
|
that can be easily accessed through the `spring-boot-starter-websocket` module.
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
alternative to spring-boot-starter-tomcat</description>
|
alternative to spring-boot-starter-tomcat</description>
|
||||||
<properties>
|
<properties>
|
||||||
<main.basedir>${basedir}/../../..</main.basedir>
|
<main.basedir>${basedir}/../../..</main.basedir>
|
||||||
|
<servlet-api.version>3.1.0</servlet-api.version>
|
||||||
</properties>
|
</properties>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.jboss.spec.javax.servlet</groupId>
|
<groupId>org.jboss.spec.javax.servlet</groupId>
|
||||||
<artifactId>jboss-servlet-api_3.1_spec</artifactId>
|
<artifactId>jboss-servlet-api_4.0_spec</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,7 @@ public final class Verify {
|
||||||
super.verifyZipEntries(verifier);
|
super.verifyZipEntries(verifier);
|
||||||
verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/spring-context");
|
verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/spring-context");
|
||||||
verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/spring-core");
|
verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/spring-core");
|
||||||
verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/javax.servlet-api-3");
|
verifier.assertHasEntryNameStartingWith("BOOT-INF/lib/javax.servlet-api-4");
|
||||||
assertThat(verifier
|
assertThat(verifier
|
||||||
.hasEntry("org/springframework/boot/loader/JarLauncher.class"))
|
.hasEntry("org/springframework/boot/loader/JarLauncher.class"))
|
||||||
.as("Unpacked launcher classes").isTrue();
|
.as("Unpacked launcher classes").isTrue();
|
||||||
|
|
@ -263,7 +263,7 @@ public final class Verify {
|
||||||
verifier.assertHasEntryNameStartingWith("WEB-INF/lib/spring-context");
|
verifier.assertHasEntryNameStartingWith("WEB-INF/lib/spring-context");
|
||||||
verifier.assertHasEntryNameStartingWith("WEB-INF/lib/spring-core");
|
verifier.assertHasEntryNameStartingWith("WEB-INF/lib/spring-core");
|
||||||
verifier.assertHasEntryNameStartingWith(
|
verifier.assertHasEntryNameStartingWith(
|
||||||
"WEB-INF/lib-provided/javax.servlet-api-3");
|
"WEB-INF/lib-provided/javax.servlet-api-4");
|
||||||
assertThat(verifier
|
assertThat(verifier
|
||||||
.hasEntry("org/" + "springframework/boot/loader/JarLauncher.class"))
|
.hasEntry("org/" + "springframework/boot/loader/JarLauncher.class"))
|
||||||
.as("Unpacked launcher classes").isTrue();
|
.as("Unpacked launcher classes").isTrue();
|
||||||
|
|
@ -314,7 +314,7 @@ public final class Verify {
|
||||||
super.verifyZipEntries(verifier);
|
super.verifyZipEntries(verifier);
|
||||||
verifier.assertHasEntryNameStartingWith("lib/spring-context");
|
verifier.assertHasEntryNameStartingWith("lib/spring-context");
|
||||||
verifier.assertHasEntryNameStartingWith("lib/spring-core");
|
verifier.assertHasEntryNameStartingWith("lib/spring-core");
|
||||||
verifier.assertHasNoEntryNameStartingWith("lib/javax.servlet-api-3");
|
verifier.assertHasNoEntryNameStartingWith("lib/javax.servlet-api");
|
||||||
assertThat(verifier
|
assertThat(verifier
|
||||||
.hasEntry("org/" + "springframework/boot/loader/JarLauncher.class"))
|
.hasEntry("org/" + "springframework/boot/loader/JarLauncher.class"))
|
||||||
.as("Unpacked launcher classes").isFalse();
|
.as("Unpacked launcher classes").isFalse();
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,6 @@ import org.springframework.test.util.ReflectionTestUtils;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.BDDMockito.given;
|
|
||||||
import static org.mockito.Mockito.inOrder;
|
import static org.mockito.Mockito.inOrder;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
@ -181,8 +180,7 @@ public class TomcatServletWebServerFactoryTests
|
||||||
TomcatServletWebServerFactory factory = getFactory();
|
TomcatServletWebServerFactory factory = getFactory();
|
||||||
Connector[] listeners = new Connector[4];
|
Connector[] listeners = new Connector[4];
|
||||||
for (int i = 0; i < listeners.length; i++) {
|
for (int i = 0; i < listeners.length; i++) {
|
||||||
Connector connector = mock(Connector.class);
|
Connector connector = new Connector();
|
||||||
given(connector.getState()).willReturn(LifecycleState.STOPPED);
|
|
||||||
listeners[i] = connector;
|
listeners[i] = connector;
|
||||||
}
|
}
|
||||||
factory.addAdditionalTomcatConnectors(listeners);
|
factory.addAdditionalTomcatConnectors(listeners);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
<properties>
|
<properties>
|
||||||
<main.basedir>${basedir}/../..</main.basedir>
|
<main.basedir>${basedir}/../..</main.basedir>
|
||||||
<m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
|
<m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
|
||||||
|
<servlet-api.version>3.1.0</servlet-api.version>
|
||||||
</properties>
|
</properties>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<!-- Compile -->
|
<!-- Compile -->
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
<description>Spring Boot Jetty SSL Sample</description>
|
<description>Spring Boot Jetty SSL Sample</description>
|
||||||
<properties>
|
<properties>
|
||||||
<main.basedir>${basedir}/../..</main.basedir>
|
<main.basedir>${basedir}/../..</main.basedir>
|
||||||
|
<servlet-api.version>3.1.0</servlet-api.version>
|
||||||
</properties>
|
</properties>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<!-- Compile -->
|
<!-- Compile -->
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
<description>Spring Boot Jetty Sample</description>
|
<description>Spring Boot Jetty Sample</description>
|
||||||
<properties>
|
<properties>
|
||||||
<main.basedir>${basedir}/../..</main.basedir>
|
<main.basedir>${basedir}/../..</main.basedir>
|
||||||
|
<servlet-api.version>3.1.0</servlet-api.version>
|
||||||
</properties>
|
</properties>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<!-- Compile -->
|
<!-- Compile -->
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue