Spring Boot本地运行Jar报JNI错误(NoClassDefFoundError: javax/servlet/Servlet)
解决Java -jar运行时javax/servlet/Servlet缺失错误
问题根源
本地开发时IDE会自动提供Servlet API依赖,但打包成可执行Jar包后,若Servlet API的依赖范围被设置为provided,构建工具(Maven/Gradle)不会将其打包进Jar,导致运行时找不到该类。
具体修复步骤
1. 调整依赖配置
Maven项目(pom.xml)
- 确保引入Spring Boot Web Starter,它会自动包含嵌入式Tomcat及所需Servlet API:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- 若单独引入了Servlet API依赖,移除
<scope>provided</scope>标签,或改为runtime:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency>
Gradle项目(build.gradle)
- 引入Spring Boot Web Starter:
implementation 'org.springframework.boot:spring-boot-starter-web'
- 若单独引入Servlet API,将
provided改为implementation或runtimeOnly:
implementation 'javax.servlet:javax.servlet-api:3.1.0'
2. 确认打包插件配置
Maven
确保Spring Boot打包插件正确配置,保证Jar包是可执行的:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>你的Spring Boot版本号</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Gradle
应用Spring Boot插件并指定主类:
plugins { id 'org.springframework.boot' version '你的Spring Boot版本号' id 'io.spring.dependency-management' version '对应依赖管理版本' id 'java' } bootJar { mainClass = 'com.yourpackage.Application' // 替换为你的主类全路径 }
3. 额外验证项
- 终端执行
java -version和echo $JAVA_HOME,确认使用的是Java 8环境,避免Mac下终端与系统环境变量不一致。 - 检查Jersey相关依赖是否正确引入,确保
ServletContainer类能被打包进Jar:
<!-- Maven示例 --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

