使用Spring Cloud Function部署AWS Lambda遇ClassNotFoundException问题求助
问题
通过AWS CLI部署基于Spring Cloud Function(Kotlin)的AWS Lambda函数,并配置S3 ObjectCreated事件触发后,触发Lambda时出现以下错误:
java.lang.ClassNotFoundException: org.springframework.cloud.function.adapter.aws.FunctionInvoker
环境信息
- Spring Boot: 3.x
- Spring Cloud Function: 4.x
- 语言: Kotlin
- 部署方式: Docker镜像推送到ECR,通过AWS CLI部署
- 触发器: S3 ObjectCreated:*事件
已排查内容
- 确认build.gradle.kts中包含spring-cloud-function-adapter-aws依赖
- 本地使用相同入口运行JAR正常
- 镜像已推送,Lambda通过CLI创建成功
解决方案
1. 修正Dockerfile配置
Spring Boot 3.x + Spring Cloud Function 4.x需要适配Lambda的Java运行时环境,调整Dockerfile如下:
- 使用Lambda官方兼容的Java 17基础镜像(Spring Boot 3.x要求Java 17+)
- 将全依赖JAR复制到Lambda指定的
/var/task目录 - 明确设置入口类为
org.springframework.cloud.function.adapter.aws.FunctionInvoker
示例Dockerfile:
FROM public.ecr.aws/lambda/java:17 # 替换为你的全依赖JAR文件名 COPY build/libs/your-function-all.jar ${LAMBDA_TASK_ROOT} CMD ["org.springframework.cloud.function.adapter.aws.FunctionInvoker"]
2. 确保Gradle打包包含所有依赖
Spring Cloud Function 4.x需要将spring-cloud-function-adapter-aws等依赖打入最终JAR,检查build.gradle.kts配置:
- 使用
shadowJar插件打包全依赖JAR(避免bootJar可能遗漏依赖的问题) - 示例核心配置:
plugins { id("org.springframework.boot") version "3.2.0" id("io.spring.dependency-management") version "1.1.4" kotlin("jvm") version "1.9.20" kotlin("plugin.spring") version "1.9.20" id("com.github.johnrengelman.shadow") version "8.1.1" } dependencies { implementation("org.springframework.cloud:spring-cloud-function-adapter-aws") implementation("com.amazonaws:aws-lambda-java-core") // 其他业务依赖... } tasks.withType<ShadowJar> { archiveClassifier.set("all") mergeServiceFiles() }
执行./gradlew shadowJar生成全依赖JAR,用于Docker构建。
3. 验证Lambda运行时配置
- 通过AWS CLI或控制台检查Lambda的处理程序(Handler),若使用Docker镜像部署,无需额外配置Handler,确保镜像的CMD已指向正确入口类即可
- 若手动配置Handler,需设置为
org.springframework.cloud.function.adapter.aws.FunctionInvoker
4. 重新构建推送镜像
- 删除旧镜像,重新执行构建命令确保JAR复制完整
- 推送新镜像到ECR后,重新部署Lambda函数,确保拉取最新镜像版本
内容的提问来源于stack exchange,提问作者HamTory
相关产品推荐
相关产品推荐

