Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AWS Lambda: ClassNotFoundException

I currently get a ClassNotFoundException whenever I try to test my Lambda function on AWS Lambda. The exception is shown here:

https://i.imgur.com/nD2OUOJ.jpg

I've searched online, including this link here: AWS Lambda: class java.lang.ClassNotFoundException, to no avail.

I am working in Android Studio and created a JAR file (using this link: How to make a .jar out from an Android Studio project) to use to upload the class to the AWS Lambda console.

Below is the structure of my project:

https://i.imgur.com/CFC8cA4.jpg

When I upload my JAR file to the AWS Lambda console, the Configuration tab looks like this:[https://i.imgur.com/s9kovF7

I was previously told that it could have been because my JAR file was not an executable JAR file with a MANIFEST.MF file, but I definitely have that.

Any other reason as to why this error consistently pops up and how to fix it?

like image 886
avu95 Avatar asked Oct 26 '17 00:10

avu95


People also ask

What is APIGatewayProxyRequestEvent?

Returns a string representation of this object; useful for testing and debugging. APIGatewayProxyRequestEvent. withBody(String body) APIGatewayProxyRequestEvent. withHeaders(Map<String,String> headers)

Can lambda function access with dedicated tenancy VPC?

Lambda functions can't connect directly to a VPC with dedicated instance tenancy. To connect to resources in a dedicated VPC, peer it to a second VPC with default tenancy .

What is a lambda function in Java?

Lambda Expressions were added in Java 8. A lambda expression is a short block of code which takes in parameters and returns a value. Lambda expressions are similar to methods, but they do not need a name and they can be implemented right in the body of a method.


1 Answers

Your handler needs to include the full Java package. In your example, you need to have the handler be:

edu.csulb.android.riseandshine.Dynamodb::handleRequest

This is configured on the Lambda screen where you currently have Dynamodb::handleRequest

EDIT

My "hello world" Lambda in looks like the following. Note that this is a maven project so the code has to live where maven expects it. At the "root" of the directory where you're developing is the pom.xml file (below) and the Java file needs to live in src/main/java/com/hotjoe/aws/lambda/hello/handler.

Once you have that and maven installed, run mvn clean package. The deployable jar will be target/hello-world-lambda-1.0-SNAPSHOT.jar. I deployed this to Lambda just now and can run it with the test:

{
  "key3": "value3",
  "key2": "value2",
  "key1": "value1"
}

which is the default for the Lambda tests. This is all taken from the AWS docs on creating a deployment. In my example, the Lambda handler is com.hotjoe.aws.lambda.hello.handler.HelloWorldLambdaHandler::handleRequest.

The code I've used is below.

HelloWorldLambdaHandler.java

package com.hotjoe.aws.lambda.hello.handler;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;


@SuppressWarnings("unused")
public class HelloWorldLambdaHandler implements RequestHandler<HelloWorldLambdaHandler.InputObject, String> {

    public String handleRequest(InputObject inputObject, Context context) {

        System.out.println( "got \"" + inputObject + "\" from call" );

        return "{\"result\": \"hello lambda java\"}";
    }

    public static class InputObject {
        private String key1;
        private String key2;
        private String key3;

        public String getKey1() {
            return key1;
        }

        public String getKey2() {
            return key2;
        }

        public String getKey3() {
            return key3;
        }

        public void setKey1(String key1) {
            this.key1 = key1;
        }

        public void setKey2(String key2) {
            this.key2 = key2;
        }

        public void setKey3(String key3) {
            this.key3 = key3;
        }

        @Override
        public String toString() {
            return "InputObject{" +
                    "key1='" + key1 + '\'' +
                    ", key2='" + key2 + '\'' +
                    ", key3='" + key3 + '\'' +
                    '}';
        }
    }
}

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hotjoe.aws.lambda.hello</groupId>
    <artifactId>hello-world-lambda</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
like image 198
stdunbar Avatar answered Oct 28 '22 04:10

stdunbar