Docker化Kotlin项目调用AWS Lambda找不到AWSLambda主类如何解决?
错误原因
你遇到的ClassNotFoundException本质是JVM启动时类路径下不存在com.amazonaws.services.lambda.runtime.api.client.AWSLambda类,由Gradle构建配置、Dockerfile路径/类路径配置错误共同导致,按以下步骤排查解决即可:
解决步骤
- 第一步:配置Gradle生成带全量依赖的Fat Jar
默认gradle build生成的jar仅包含项目自身代码,不会把你依赖的aws-lambda-java-runtime-interface-client等第三方包打包进去。需要引入Shadow插件生成带所有依赖的可执行jar:
在app/build.gradle中添加如下配置:
// 顶部plugins块添加shadow插件,保留你原有kotlin、java等插件 plugins { id 'com.github.johnrengelman.shadow' version '7.1.2' id 'java' id 'kotlin' } dependencies { // 保留你原有依赖,包括aws-lambda-java-runtime-interface-client implementation 'com.amazonaws:aws-lambda-java-runtime-interface-client:1.1.0' } shadowJar { mergeServiceFiles() // 合并Lambda依赖的服务配置文件,避免运行时隐式报错 } // 配置build任务自动执行shadowJar build.dependsOn shadowJar
执行构建后会在app/build/libs目录下生成名称带-all后缀的fat jar,该文件已包含所有运行所需依赖。
- 第二步:修正Dockerfile配置
你原有Dockerfile存在LAMBDA_TASK_ROOT变量未定义、文件复制路径冗余混乱、类路径配置错误三个问题,修改后的完整第二阶段配置如下:
FROM adoptopenjdk/openjdk13:debianslim-jre # 定义Lambda要求的任务根目录变量,普通JRE镜像未预置该变量 ENV LAMBDA_TASK_ROOT=/var/task WORKDIR ${LAMBDA_TASK_ROOT} # 仅复制构建好的fat jar即可,无需单独复制零散的class、依赖包 COPY --from=builder /home/gradle/app/build/libs/app-all.jar ./app.jar ENTRYPOINT [ "java", "-cp", "app.jar", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda" ] CMD ["readCartMessageDBLambda.App::handleRequest"]
- 第三步:本地提前验证
镜像构建完成后可本地执行命令验证类是否存在,避免部署到Lambda后才发现问题:
docker run --rm --entrypoint java 你的镜像名称 -cp app.jar com.amazonaws.services.lambda.runtime.api.client.AWSLambda -version
如果没有抛出类找不到的错误,说明配置正确,可以正常部署到Lambda。
内容的提问来源于stack exchange,提问作者Nicholas Johnson
相关产品推荐
相关产品推荐

