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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:24:01