部署SpringBoot 3.3应用为AWS Lambda时遭遇ClassNotFoundException
解决SpringBoot 3.3部署AWS Lambda时的ClassNotFoundException问题
问题原因
SpringBoot默认通过spring-boot-maven-plugin打包的是可执行JAR,这类JAR的类文件统一存放在BOOT-INF/classes目录下,依赖包则在BOOT-INF/lib中。而AWS Lambda的Java运行时类加载器只会扫描JAR根目录下的类文件,无法识别SpringBoot这种嵌套结构的类路径,因此找不到你指定的org.xyz.service.api.http.xxx.AwsLambdaHandler类。
解决方案
方案1:使用Spring Cloud Function适配器(推荐)
Spring Cloud Function专为SpringBoot应用部署到Lambda做了适配,自动处理类路径问题,步骤如下:
- 在
pom.xml中添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-adapter-aws</artifactId> </dependency>
- 修改Lambda的处理器配置为:
org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest - 确保你的
AwsLambdaHandler实现Function(或Supplier/Consumer等函数式接口),或者通过@Bean定义一个函数类型的Bean。
方案2:调整打包方式为普通JAR(不推荐)
若不想使用Spring Cloud Function,可修改Maven配置生成普通JAR,让类直接处于JAR根目录:
- 移除或禁用
spring-boot-maven-plugin的可执行打包逻辑,改用maven-jar-plugin:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>org.xyz.service.api.http.xxx.AwsLambdaHandler</mainClass> </manifest> </archive> </configuration> </plugin>
- 用
maven-dependency-plugin将依赖包复制到独立目录,再将JAR和依赖目录一起打包成ZIP上传到Lambda(此方式需手动处理依赖,较为繁琐)。
额外排查点
- 确认
AwsLambdaHandler类为public,且handleRequest方法是public、static(若为普通类),同时方法签名符合Lambda要求的输入输出类型。 - 用
jar tf your-jar-file.jar命令检查打包后的类路径,确保类的存放位置符合Lambda类加载器的扫描规则。
内容的提问来源于stack exchange,提问作者Abdul
相关产品推荐
相关产品推荐

