如何修复部署Spring Boot到AWS Lambda时的类缺失错误
错误修复方案
错误根源
你遇到的java.lang.NoClassDefFoundError: javax.servlet.ServletException是版本不兼容导致的核心问题:
- Spring Boot 2.7.x基于Java EE API(包前缀
javax.servlet) - 你引入的
aws-serverless-java-container-springboot3是为Spring Boot 3.x设计的,后者基于Jakarta EE API(包前缀jakarta.servlet) - 同时Handler代码中导入了
jakarta.servlet类,和Spring Boot 2.x的javax.servlet体系冲突
下面提供两种可行的修复方案:
方案一:升级到Spring Boot 3.x(推荐)
Spring Boot 3.x是长期支持版本,且与aws-serverless-java-container-springboot3适配性更好。
1. 修改Gradle配置
apply plugin: 'java' repositories { mavenLocal() mavenCentral() } // Spring Boot 3要求最低Java 17 sourceCompatibility = 17 targetCompatibility = 17 dependencies { implementation('org.springframework.boot:spring-boot-starter-web:3.2.0') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } // 使用稳定版的Spring Boot3适配包 implementation 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:2.0.0' } task buildZip(type: Zip) { from compileJava from processResources into('lib') { from(configurations.compileClasspath) { exclude 'tomcat-embed-*' } } } build.dependsOn buildZip
2. 调整Lambda运行时(Pulumi代码)
将Java运行时改为Java 17:
export const usersFunction = new aws.lambda.Function("users-function", { code: new pulumi.asset.FileArchive("../build/distributions/pet.zip"), runtime: aws.lambda.Runtime.Java17, // 替换为Java17 handler: handler, role: usersExecutionRole.arn, name: stack + '-' +"petsFunction", memorySize: 10240, timeout: 900, tracingConfig:{mode:"Active"}, architectures:["arm64"], });
3. 验证Handler代码
Handler中的jakarta.servlet导入无需修改,Spring Boot 3.x原生支持Jakarta EE API。
方案二:保留Spring Boot 2.7.x,降级AWS适配包
如果不想升级Spring Boot版本,可切换到对应Spring Boot 2.x的AWS适配包。
1. 修改Gradle配置
apply plugin: 'java' repositories { mavenLocal() mavenCentral() } sourceCompatibility = 11 targetCompatibility = 11 dependencies { implementation('org.springframework.boot:spring-boot-starter-web:2.7.13') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } // 使用Spring Boot2对应的适配包 implementation 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:1.12.0' } task buildZip(type: Zip) { from compileJava from processResources into('lib') { from(configurations.compileClasspath) { exclude 'tomcat-embed-*' } } } build.dependsOn buildZip
2. 修改Handler代码的导入
将jakarta.servlet替换为javax.servlet:
// 替换前 import jakarta.servlet.DispatcherType; import jakarta.servlet.FilterRegistration; // 替换后 import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration;
3. 保持Lambda运行时不变
Pulumi中的runtime继续使用aws.lambda.Runtime.Java11即可。
最后步骤
- 执行
./gradlew clean buildZip重新生成部署包 - 运行Pulumi部署命令更新Lambda函数
内容的提问来源于stack exchange,提问作者stein korsveien
相关产品推荐
相关产品推荐

