Kuldeep Yadav
Kuldeep Yadav

Reputation: 1806

NoClassDefFoundError for AmazonDynamoDBClientBuilder on runtime

I am getting following exception and not able to figure out what exactly is going wrong?

START RequestId: 6e561b8c-2fd0-11e8-8bd0-edfc4c9a75aa Version: $LATEST
com/amazonaws/services/dynamodbv2/AmazonDynamoDBClientBuilder: **java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: com/amazonaws/services/dynamodbv2/AmazonDynamoDBClientBuilder**
    at com.tarkshala.dynamodb.StudentDAOImpl.create(StudentDAOImpl.java:12)
    at com.tarkshala.lambda.StudentController.handleRequest(StudentController.java:16)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
Caused by: java.lang.ClassNotFoundException: com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 6 more

My pom.xml looks like below:

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.11.301</version>
    </dependency>

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.2.0</version>
    </dependency>

Even my IDE is resolving class defination then why it is creating problem on runtime?

Upvotes: 1

Views: 2792

Answers (1)

Mike Dinescu
Mike Dinescu

Reputation: 55720

From the error message it looks like you are trying to query DynamoDb from a Lambda function implemented in Java.

When using Java based AWS Lambda functions your function code must contain all dependencies. You can’t rely on Lambda to resolve your dependencies from a pom.xml, the way a local system using Maven would.

The most common way is to generate a single JAR (commonly called a “fat JAR”) containing your code and all dependencies required by your code (typically everything in the classpath that would be required to execute your code).

Once you get the dependencies deployed to Lambda along with your code, things should start working as you expect.

See: more info about how to generate a fat JAR using a Maven plugin

Upvotes: 3

Related Questions