Bien que Tomcat soit le conteneur de servlets embarqué par défaut dans les applications Spring Boot, il est souvent nécessaire de privilégier Jetty pour des raisons spécifiques, telles que des contraintes de performence ou des besoins particuliers en matière de traitement asynchrone. Spring Boot facilite cette transition grâce aux starters dédiés. Voici la procédure pour substituer Tomcat par Jetty et configurer le serveur résultant.
Ajout des dépendances Maven
Pour utiliser Jetty, la première étape consiste à modifier le fichier pom.xml. Il est impératif d'exclure la dépendance spring-boot-starter-tomcat du module web par défaut et d'ajouter explicitement la dépendance Jetty.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
Configuration avec Gradle
Si votre projet utilise Gradle comme outil de build, la logique reste identique mais la syntaxe diffère légèrement. On utilise le bloc configurations pour écarter le module Tomcat.
configurations {
all*.exclude module: 'spring-boot-starter-tomcat'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jetty'
}
Paramétrage via le fichier de propriétés
Une fois les dépendances ajustées, il est possible de redéfinir le comportement du serveur Jety directement dans le fichier application.properties. Cela inclut le port d'écoute, le chemin de contexte ainsi que les paramètres spécifiques aux threads d'acceptation et de sélection.
# Port et contexte global
server.port=8081
server.servlet.context-path=/api
# Réglages spécifiques à Jetty
server.jetty.acceptors=2
server.jetty.max-http-post-size=200000
server.jetty.selectors=4
Configuration programmatique (Approche legacy)
Pour une granularité plus fine, on peut configurer le serveur via une classe de configruation Java. Dans les versions antérieures à Spring Boot 2.0, on utilisait le bean JettyEmbeddedServletContainerFactory.
@Bean
public JettyEmbeddedServletContainerFactory embeddedJetty() {
JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
factory.setPort(8081);
factory.setContextPath("/api");
return factory;
}
Mise à jour pour Spring Boot 2.x et ultérieur
À partir de la version 2.0.0.RELEASE, l'API a évolué. Il convient désormais d'utiliser l'interface ConfigurableServletWebServerFactory et son implémentation JettyServletWebServerFactory. Voici comment définir ces paramètres dans une configuration moderne :
@Bean
public ConfigurableServletWebServerFactory servletContainer() {
JettyServletWebServerFactory jettyFactory = new JettyServletWebServerFactory();
// Configuration de base
jettyFactory.setPort(8443);
jettyFactory.setContextPath("/secure-app");
// Gestion des pages d'erreur personnalisées
ErrorPage error404 = new ErrorPage(HttpStatus.NOT_FOUND, "/errors/404.html");
jettyFactory.addErrorPages(error404);
return jettyFactory;
}