运行时出现AmazonDynamoDBClientBuilder的NoClassDefFoundError,求助排查
java.lang.NoClassDefFoundError: com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder异常 这个错误本质是你的Lambda运行环境中找不到AmazonDynamoDBClientBuilder类,90%以上的情况是DynamoDB SDK依赖没有正确打包到部署包中,或者依赖版本/类型不匹配,下面是具体的解决步骤:
1. 确认依赖配置正确
首先检查你的项目依赖管理文件(Maven/Gradle),确保已经添加了正确的DynamoDB SDK v1依赖:
Maven 配置
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-dynamodb</artifactId> <version>1.12.500</version> <!-- 选择与Lambda运行时兼容的版本,比如Java 8选1.x系列,Java 17也支持1.x --> <scope>compile</scope> <!-- 不要用provided,Lambda当前的Java运行时不再默认携带旧版SDK --> </dependency>
Gradle 配置
implementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.500'
⚠️ 注意:如果你误引入了AWS SDK v2的依赖,类名会变成software.amazon.awssdk.services.dynamodb.DynamoDbClientBuilder,和v1的类完全不同,这种混版本的情况也会导致找不到类的问题。
2. 正确打包包含所有依赖的部署包
Lambda要求部署包包含你的代码以及所有依赖的类文件,只打包自己的代码是不行的。这里推荐用插件来构建胖包:
Maven 用maven-shade-plugin
在pom.xml的<build>节点下添加插件配置:
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> </execution> </executions> </plugin> </plugins>
执行mvn package后,target目录下带-shaded后缀的JAR就是可以上传到Lambda的包。
Gradle 用shadowJar插件
在build.gradle中添加插件:
plugins { id 'com.github.johnrengelman.shadow' version '7.1.2' }
执行./gradlew shadowJar,生成的JAR在build/libs目录下,通常是项目名-all.jar。
3. 验证部署包内容
解压生成的部署包,检查是否存在com/amazonaws/services/dynamodbv2/AmazonDynamoDBClientBuilder.class文件。如果没有,说明依赖没被打包进去,需要重新检查插件配置或者依赖的scope是否正确。
4. 匹配Lambda运行时版本
确保Lambda的Java运行时版本和你项目编译时的版本一致(比如项目用Java 8编译,Lambda就选Java 8运行时),避免因JVM版本不兼容导致的类加载问题。
如果按上面的步骤操作后还是有问题,可以检查依赖树是否有冲突(比如其他依赖引入了不同版本的DynamoDB SDK),用mvn dependency:tree或者./gradlew dependencies来排查。
内容的提问来源于stack exchange,提问作者Kuldeep Yadav

