Spring Boot通过Serverless部署AWS Lambda报ClassNotFoundException如何解决
报错日志:
START RequestId: 38c9bbd7-c7f1-4779-9486-c19c22528fc4 Version: $LATEST Class not found: com.application.lambda.LambdaMethodHandler: java.lang.ClassNotFoundException java.lang.ClassNotFoundException: com.application.lambda.LambdaMethodHandler. Current classpath: file:/var/task/
问题根因
你怀疑的情况完全正确。Spring Boot默认生成的可执行JAR采用专属的类加载结构,业务自定义类统一存放在BOOT-INF/classes/路径下,第三方依赖存放在BOOT-INF/lib/路径下。而AWS Lambda的Java运行时类加载器仅会扫描部署包根路径下的类和资源,无法识别BOOT-INF目录下的内容,因此会触发类找不到的异常。
Java 11环境适配解决方案
方案1:使用Spring Cloud Function AWS官方适配器(推荐)
该方案为官方适配方案,无需手动调整打包结构,兼容性更强:
- 首先在pom.xml中引入适配依赖,需匹配你使用的Spring Boot版本,示例适配Spring Boot 2.7.x + Java 11的依赖配置如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-adapter-aws</artifactId> <version>3.2.9</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.21</version> <scope>provided</scope> </dependency>
- 修改你的Handler类继承官方父类,自动加载Spring上下文:
package com.application.lambda; import org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler; public class LambdaMethodHandler extends SpringBootRequestHandler<Object, Object> { // 无需额外实现逻辑,父类会自动完成Spring上下文初始化和请求路由 }
- 执行
mvn clean package打包,生成的JAR可直接上传到Lambda部署。
方案2:调整Maven Shade插件配置(适配你当前已使用Shade的场景)
如果不想引入额外依赖,可直接修改Shade插件配置,把BOOT-INF下的类移到JAR包根路径:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <filters> <filter> <artifact>*:*</artifact> <excludes> <!-- 排除签名文件避免运行时校验错误 --> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 合并Spring的配置文件避免冲突 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> <!-- 指定主类为你的Lambda处理器 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.application.lambda.LambdaMethodHandler</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
- 配置完成后执行
mvn clean package,生成的带有shaded后缀的JAR即可直接上传部署 - 确认Lambda控制台运行时选择
Java 11 (Corretto),「处理程序」配置填写com.application.lambda.LambdaMethodHandler即可。
内容的提问来源于stack exchange,提问作者Hardik Uchdadiya
相关产品推荐
相关产品推荐

