Using Jersey 3x + Jetty to develop endpoints, but hits the following error during application startup.

Terminal

Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/servlet/ServletInputStream
  at org.glassfish.jersey.jetty.JettyHttpContainerProvider.createContainer(JettyHttpContainerProvider.java:43)
  at org.glassfish.jersey.server.ContainerFactory.createContainer(ContainerFactory.java:58)
  at org.glassfish.jersey.jetty.JettyHttpContainerFactory.createServer(JettyHttpContainerFactory.java:110)
  at com.mkyong.MainApp.startServer(MainApp.java:22)
  at com.mkyong.MainApp.main(MainApp.java:32)

Caused by: java.lang.ClassNotFoundException: jakarta.servlet.ServletInputStream
  at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
  at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
  at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
  ... 5 more

1. jakarta/servlet/* and Servlet API 5.0

Since Servlet API 5.0, the API moved from the package javax.servlet to jakarta.servlet.

Below is the short history of Servlet API

Servlet APIReleasePlatformNote
Servlet 5.0Jun 12, 2020Jakarta EE 9API moved from package javax.servlet to jakarta.servlet
Servlet 4.0.3Aug 13, 2019Jakarta EE 8Renamed from “Java” trademark, API package still javax.servlet
Servlet 4.0Sep 2017Java EE 8javax.servlet
Servlet 3.1May 2013Java EE 7javax.servlet

2. Solution

Some libraries depend on the Servlet API 5.0, which can not found in the project dependency. We can fix it by including the following jakarta.servlet-api@5.0.0:

pom.xml

  <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>5.0.0</version>
  </dependency>

3. References

Leave a Reply

Your email address will not be published. Required fields are marked *