2017-10-26 6 views
1

Ich erhalte derzeit eine ClassNotFoundException, wenn ich versuche, meine Lambda-Funktion auf AWS Lambda zu testen. Die Ausnahme wird hier gezeigt:AWS Lambda: ClassNotFoundException

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

ich online gesucht haben, auch diesen Link hier: AWS Lambda: class java.lang.ClassNotFoundException, ohne Erfolg.

Ich arbeite in Android Studio und erstellte eine JAR-Datei (mit diesem Link: How to make a .jar out from an Android Studio project) zum Hochladen der Klasse in die AWS Lambda-Konsole.

Unten ist die Struktur meines Projekts:

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

Wenn ich meine JAR-Datei auf der Konsole AWS Lambda laden, sieht die Registerkarte Konfiguration wie folgt aus: [https://i.imgur.com/s9kovF7

ich vorher gesagt wurde, das könnte daran liegen, dass meine JAR-Datei keine ausführbare JAR-Datei mit einer MANIFEST.MF-Datei war, aber das habe ich definitiv.

Irgendein anderer Grund, warum dieser Fehler konsequent auftaucht und wie man es repariert?

+0

Posten Sie nicht eine Reihe von Screenshots - bitte aktualisieren Sie Ihre Post mit den tatsächlichen Fehlern. – stdunbar

+0

Entschuldigung. Ich habe Änderungen vorgenommen, damit es widerspiegelt, was ich bekomme. – avu95

Antwort

1

Ihr Handler muss das vollständige Java-Paket enthalten. In Ihrem Beispiel, müssen Sie die Prozedur haben:

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

Dies ist auf dem Lambda-Bildschirm konfigurieren, wo Sie sich gerade Dynamodb::handleRequest

EDIT

Meine "Hallo Welt" Lambda haben sieht wie folgt aus. Beachten Sie, dass dies ein Maven-Projekt ist, also muss der Code dort leben, wo Maven es erwartet. Im "root" des Verzeichnisses, in dem Sie arbeiten, befindet sich die Datei pom.xml (unten), und die Java-Datei muss in src/main/java/com/hotjoe/aws/lambda/hello/handler gespeichert sein.

Sobald Sie das und Maven installiert haben, führen Sie mvn clean package. Das bereitstellbare Glas wird target/hello-world-lambda-1.0-SNAPSHOT.jar sein. Ich habe dies jetzt in Lambda implementiert und kann es mit dem Test ausführen:

Das ist die Standardeinstellung für die Lambda-Tests. Dies stammt alles aus der AWS docs beim Erstellen einer Bereitstellung. In meinem Beispiel ist der Lambda-Handler com.hotjoe.aws.lambda.hello.handler.HelloWorldLambdaHandler::handleRequest.

Der Code, den ich verwendet habe, ist unten.

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> 
+0

Ich ging weiter und versuchte Ihren Vorschlag. Der Fehler, den ich bekomme, ist der gleiche, außer länger. '{" errorMessage ":" Klasse nicht gefunden: edu.csulb.android.riseandshine.Dynamodb "," errorType ":" java.lang.ClassNotFoundException "}' – avu95

+1

@ avu95 - wie verpacken Sie Ihre Lambda-Funktion? Ich habe es immer nur durch Maven gemacht - schaffst du dein eigenes Paket? – stdunbar

+0

Derzeit verwende ich Android Studio, um meine Lambda-Funktion mit Aufgaben zu packen, die ich aus meiner build.gradle-Datei in meinem Projektordner erstellt habe. Wird Maven für die Verpackung von Lambda-Funktionen empfohlen? – avu95

1

Der Stack-Trace zeigt an, dass die Java-Laufzeitumgebung keine Klasse namens "Dynamodb" finden kann. Es gibt keine solche Klasse im AWS SDK for Java. Der korrekte Klassenname lautet "DynamoDB". Beachten Sie den Unterschied in der Groß- und Kleinschreibung zwischen Ihrer Klasse und dem korrekten Namen.

+0

Die Klasse, die ich verwenden möchte, heißt wörtlich "Dynamodb". Ich versuche nicht, die Klasse im AWS SDK als den Namen der Java-Datei zu verwenden, wenn das sinnvoll ist. – avu95