java.lang.NoClassDefFoundError: javax/servlet/Servlet
at org.eclipse.jetty.webapp.WebDescriptor.newParser(WebDescriptor.java:91)
at org.eclipse.jetty.webapp.WebAppContext.preConfigure(WebAppContext.java:457)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:493)
...
直接原因:運行時類路徑缺少 javax.servlet.Servlet 接口類。
深層原因:
provided 導致打包不包含)<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version> <!-- Jetty 9 对应 Servlet 3.1 -->
<scope>compile</scope> <!-- 關鍵:compile 確保打包包含,provided 僅編譯時 -->
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.4.48.v20220622</version> <!-- 與 Jetty 版本一致 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 自動包含 spring-boot-starter-jetty,內含 Servlet API -->
</dependency>
<!-- 若需排除 Tomcat -->
<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>
| Scope | 編譯期 | 測試期 | 運行期/打包 | 適用場景 |
|---|---|---|---|---|
| compile | ✅ | ✅ | ✅ | 嵌入式容器、獨立應用 |
| provided | ✅ | ✅ | ❌ | WAR 部署到外部容器 |
| runtime | ❌ | ✅ | ✅ | JDBC 驅動等 |
關鍵點:嵌入式 Jetty 屬於「運行期容器」,必須使用 compile 範圍,否則打包後無 Servlet API 類。
pom.xml 添加依賴mvn clean compile dependency:tree 確認 javax.servlet-api 存在於 compile 範圍mvn package 打包BOOT-INF/lib/ 或 WEB-INF/lib/ 包含 javax.servlet-api-3.1.0.jarNoClassDefFoundError| Jetty 版本 | Servlet 版本 | javax.servlet-api 版本 | Spring Boot 版本 |
|---|---|---|---|
| 9.4.x | 3.1 | 3.1.0 | 2.1 - 2.7 |
| 10.0.x | 4.0 | 4.0.0 / 4.0.1 | 3.0+ |
| 11.0.x | 5.0 | 5.0.0 | 3.1+ |
javax.servlet-api 和 jakarta.servlet-api(除非遷移 Jakarta EE)mvn dependency:analyze 檢測未聲明/未使用依賴dependencyManagement 統一版本