AWS CDK部署Java Lambda报Class not found: lambda.PocLambdaHandler如何解决
问题根本原因
- Node.js是解释型语言,Lambda可以直接执行
.js源码文件,所以你配置Nodejs运行时的测试逻辑可以正常运行。但Java是编译型语言,无法直接识别.java源文件,你当前通过Code.fromAsset("lambda")上传的只有未编译的Java源码,没有经过编译打包,Lambda运行时自然找不到对应的类。
解决步骤
1. 调整项目结构并配置Lambda打包规则
推荐给Lambda代码单独配置打包逻辑,调整后的项目结构参考:
main-project ├── lambda │ ├── src │ │ └── main │ │ └── java │ │ └── lambda // 对应类的包名 │ │ └── PocLambdaHandler.java │ └── pom.xml // Lambda子模块的maven配置文件 ├── src │ └── main │ └── java │ └── com │ └── myorg │ ├── JavaPocApp.java │ └── JavaPocStack.java └── pom.xml // 父项目maven配置
2. 配置Lambda子模块的打包插件
在lambda/pom.xml中添加maven-shade-plugin,将Lambda代码和依赖一起打包为可执行jar:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> </execution> </executions> </plugin> </plugins> </build>
3. 修改CDK中Lambda的代码路径
将Code.fromAsset的路径指向Lambda打包后生成的jar文件:
final Function FunctionPOC = Function.Builder.create(this, "POCHandlerStack") .runtime(Runtime.JAVA_8) // 路径中的jar名和版本号与你lambda子模块pom中配置的保持一致 .code(Code.fromAsset("lambda/target/lambda-1.0-SNAPSHOT.jar")) .handler("lambda.PocLambdaHandler") .build();
4. 重新执行部署流程
- 先进入
lambda目录执行mvn clean package生成带依赖的jar包 - 回到项目根目录执行
cdk deploy完成部署
额外检查项
- 确认
PocLambdaHandler是public修饰的普通类,实现了com.amazonaws.services.lambda.runtime.RequestHandler接口 - 打包完成后可以解压jar包,确认
lambda/PocLambdaHandler.class文件存在且目录结构和包名一致
内容的提问来源于stack exchange,提问作者TJ-AWS
相关产品推荐
相关产品推荐

