// OSSeva Blog
MigrationTomcat vs Jetty vs Undertow vs Netty: Servlet Containers, Spring Boot Support and Which to Run
The short answer
For most Java web applications, Tomcat is the default and the safe choice: it is what Spring Boot uses unless told otherwise, so most Spring Boot documentation and examples assume it. Jetty is a sound alternative, especially where you want one server to run old javax and new jakarta applications side by side. Undertow is no longer an option in Spring Boot 4, and Netty is not a servlet container at all. Spring Boot 4.1 supports embedded Tomcat and Jetty for servlet applications, and Reactor Netty, Tomcat or Jetty for reactive ones. Whichever you choose, the version line and its support date matter more than the brand.
Tomcat vs Jetty vs Undertow vs Netty at a glance
| Apache Tomcat | Eclipse Jetty | Undertow | Netty | |
|---|---|---|---|---|
| What it is | Jakarta Servlet, Pages, EL and WebSocket implementation | Web server and servlet container, also usable as an HTTP client | Java web server with blocking and non-blocking APIs | Asynchronous, event-driven network application framework |
| Steward and licence | Apache Software Foundation, Apache 2.0 | Eclipse Foundation, EPL 2.0 or Apache 2.0 | Sponsored by JBoss, Apache 2.0 | Netty project, Apache 2.0 |
| Current lines | 11.0 (Servlet 6.1), 10.1 (Servlet 6.0), 9.0 (Servlet 4.0) | 12.1 (Servlet up to 6.1), 12.0 (up to 6.0) | 2.4.x releases; default web server in WildFly | Current releases on 4.2 and 4.1 |
| Spring Boot 4 | Default for servlet apps | Supported alternative | Dropped | Default for WebFlux, through Reactor Netty |
Apache Tomcat
Tomcat is the Apache Software Foundation's implementation of the Jakarta Servlet, Jakarta Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. Three lines are supported today. Tomcat 11.0 implements Servlet 6.1 and needs Java 17 or later. Tomcat 10.1 implements Servlet 6.0 on Java 11 or later. Tomcat 9.0 implements Servlet 4.0 on the old javax namespace and runs on Java 8 or later.
Tomcat 9.0's clock is running. The project has announced that 9.0 support ends on 31 March 2027. A 9.1.x branch will then carry on with releases until 31 December 2030, with minimal differences except that the APR/native connectors for HTTP, HTTPS and AJP go away. Tomcat 8.5 reached end of life on 31 March 2024 and 10.0 on 31 October 2022. Our Tomcat 9 end of support and 9.1.x post and Tomcat 9 to 10.1 migration guide cover the options.
Eclipse Jetty
Jetty is an Eclipse Foundation project, dual-licensed under the Eclipse Public License 2.0 and the Apache License 2.0. Jetty 12 is the community-supported version, in two lines. Jetty 12.1 supports Servlet 3.1 through 6.1, which is Jakarta EE 8 through EE 11, and Jetty 12.0 supports up to Servlet 6.0, EE 8 through EE 10; both need Java 17. Because Jetty 12 serves both the javax and jakarta namespaces, one server can host an older javax application next to a jakarta one, which helps during a namespace migration. Jetty's protocol list includes HTTP/1.1, HTTP/2, HTTP/3, WebSocket and FastCGI.
Older Jetty lines are finished. Jetty 9.4, 10 and 11 are marked EOL and unsupported, and community support for 10 and 11 ended on 1 January 2024. Jetty is also embedded in other products, including Apache Solr, so a Jetty version can hide inside software you do not think of as a web server.
Undertow and Netty
Undertow is a Java web server with blocking and non-blocking APIs on NIO, sponsored by JBoss and the default web server in the WildFly application server. Spring Boot 3.5 offered it as an embedded server. Spring Boot 4 dropped it: the migration guide says Spring Boot 4 requires a Servlet 6.1 baseline, "with which Undertow is not yet compatible", so the Undertow starter and embedded Undertow support are gone. Applications on Undertow need to switch to Tomcat or Jetty as part of the Spring Boot 4 upgrade.
Netty is a different kind of software: an asynchronous, event-driven framework for building protocol servers and clients. It is not a servlet container and does not run WAR files. In the Spring world you meet it through Reactor Netty, the default server for Spring WebFlux applications, and inside many clients and brokers. Comparing Tomcat with Netty is really comparing the servlet model with the reactive model.
Spring Boot: Tomcat, Jetty or Netty
Spring Boot's documentation states that for servlet applications it supports embedded Tomcat and Jetty. The web starter brings in Tomcat through spring-boot-starter-tomcat; to use Jetty, exclude spring-boot-starter-tomcat from spring-boot-starter-webmvc and add spring-boot-starter-jetty. WebFlux applications get Reactor Netty through spring-boot-starter-reactor-netty and can use Tomcat or Jetty instead.
- Stay on Tomcat unless you have a reason to move. It is the default, and Spring Boot's documentation and examples assume it.
- Choose Jetty if you want its HTTP client and server from one project, already run Jetty elsewhere, or need one server for javax and jakarta applications during a migration.
- Choose Reactor Netty by choosing WebFlux, when the application is reactive end to end. Moving a blocking servlet application onto Netty is a rewrite, not a server swap.
- Leave Undertow before or during the move to Spring Boot 4.
Performance
Tomcat, Jetty and Undertow are all mature, long-running projects, and published benchmarks between them mostly measure configuration: thread pool sizes, connector types, keep-alive settings and TLS. For a typical Spring MVC application, database calls and serialisation dominate response time, not the container. The meaningful architectural choice is blocking servlets versus a reactive stack on Netty, and that is a programming model decision more than a performance one. Load test your own application on each server you are considering.
Where OSSeva fits
OSSeva for Apache Tomcat ships patched, signed builds of Tomcat 8.5, 9.0 and 10.0, and covers 10.1 and 11, delivered through Docker, apt, yum and zip. OSSeva Assure adds a hardening review, an HTTP, HTTPS and AJP connector audit and a Tomcat 10 and 11 migration assessment; OSSeva Operate adds 24/7 monitoring with a 15-minute P1 response and a named Tomcat engineer. Tomcat embedded in a Spring Boot application covered by OSSeva for Spring Boot is included without a separate engagement. OSSeva does not offer separate support for Jetty, Undertow or Netty, though the Jetty bundled inside Apache Solr is patched with OSSeva for Solr. Tomcat is priced per application server. See Tomcat support providers and Tomcat end-of-life dates, or book a discovery call for a quote.
Frequently asked questions
Tomcat vs Jetty: which is better?
Neither in general. Both are mature, open source servlet containers supported by Spring Boot. Tomcat is Spring Boot's default; Jetty suits teams that already know it or need one server for javax and jakarta applications. Decide on familiarity and supported versions.
Tomcat vs Undertow: should I still use Undertow?
Not with Spring Boot 4, which dropped Undertow because it is not yet compatible with Servlet 6.1. Undertow remains the web server in WildFly. Spring Boot 3.5 applications on Undertow should plan a move to Tomcat or Jetty with the Spring Boot 4 upgrade.
Tomcat vs Netty: what is the difference?
Tomcat is a servlet container that runs blocking servlet applications and WAR files. Netty is an asynchronous network framework; Spring WebFlux runs on it through Reactor Netty. Choosing between them means choosing between the servlet and reactive programming models.
Spring Boot Tomcat vs Jetty: how do I switch?
Exclude spring-boot-starter-tomcat from spring-boot-starter-webmvc and add spring-boot-starter-jetty. Spring Boot then auto-configures embedded Jetty on the same port, 8080 by default.
Which Tomcat version does Spring Boot 4 need?
Spring Boot 4 requires a Servlet 6.1 baseline, which is the Tomcat 11 line, or Jetty 12.1. Applications still on Tomcat 9 or javax APIs need the jakarta namespace migration first.
When does Tomcat 9 support end?
On 31 March 2027. A 9.1.x branch then continues with releases until 31 December 2030, without the APR/native connectors.
Tags
Related articles
Kafka vs Redis: Streams, Pub/Sub, Queues and When to Use Each
October 8, 2026OperationsKafka vs NATS (and JetStream): Design, Delivery, Performance and Where RabbitMQ Fits
October 8, 2026OperationsActiveMQ Classic vs Artemis: Which Broker to Run, Support Status and Performance
October 8, 2026Ready to get your open source under control?
Talk to an OSSeva engineer about CVE coverage, compliance, and migration support for your stack.