You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复部署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即可。


最后步骤

  1. 执行./gradlew clean buildZip重新生成部署包
  2. 运行Pulumi部署命令更新Lambda函数

内容的提问来源于stack exchange,提问作者stein korsveien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:52:01