AWS Lambda: ClassNotFoundException
Ich derzeit bekomme eine ClassNotFoundException, wenn ich versuche, zu testen, meine Lambda-Funktion auf AWS Lambda. Die Ausnahme ist hier dargestellt:
Habe ich online recherchiert, mit diesem link hier: AWS Lambda: class java.lang.ClassNotFoundException, ohne Erfolg.
Arbeite ich in Android Studio und erstellt eine JAR-Datei (mit diesem link: Wie man eine .jar-out von Android Studio Projekt) zum hochladen der Klasse der AWS Lambda-Konsole.
Unten ist die Struktur von meinem Projekt:
Wenn ich lade meine JAR-Datei in der AWS Lambda-Konsole die Registerkarte Konfiguration sieht wie folgt aus:[
War ich früher auch gesagt, dass es gewesen sein könnte, weil meine JAR-Datei wurde nicht eine ausführbare JAR-Datei mit einem MANIFEST.MF-Datei, aber ich habe definitiv das.
Einem anderen Grund als zu warum diese Fehler konsequent erscheint und wie es zu lösen ist?
- Nicht post ein paar screenshots - bitte aktualisieren Sie Ihren Beitrag mit dem tatsächlichen Fehler.
- Tut mir Leid, dass. Ich habe änderungen vorgenommen, so dass es sollte das widerspiegeln, was ich bekomme.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre handler muss das komplette Java-Paket. In deinem Beispiel müssen Sie die handler werden:
edu.csulb.android.riseandshine.Dynamodb::handleRequest
Konfiguriert wird dies über die Lambda-Bildschirm, wo Sie haben derzeit
Dynamodb::handleRequest
BEARBEITEN
Mein "Hallo Welt" Lambda in der wie folgt aussieht. Beachten Sie, dass dies ist ein maven-Projekt, so der code muss dort Leben, wo maven erwartet. Auf der "root" des Verzeichnisses, in dem Sie die Entwicklung der pom.xml Datei (unten) und die Java-Datei muss Leben in
src/main/java/com/hotjoe/aws/lambda/hello/handler
.Sobald Sie das haben, und maven installiert ist, führen Sie
mvn clean package
. Die einsetzbaren Glas wirdtarget/hello-world-lambda-1.0-SNAPSHOT.jar
. Ich bereitgestellt das Lambda gerade jetzt, und kann es mit dem testen:das ist der Standard für die Lambda-tests. All das stammt aus der AWS-docs auf eine Bereitstellung erstellen. In meinem Beispiel wird der Lambda-handler ist
com.hotjoe.aws.lambda.hello.handler.HelloWorldLambdaHandler::handleRequest
.Den code, den ich verwendet habe, ist unten.
HelloWorldLambdaHandler.java
pom.xml:
{ "errorMessage": "Class not found: edu.csulb.android.riseandshine.Dynamodb", "errorType": "java.lang.ClassNotFoundException" }
Den stack-trace zeigt, dass die Java-runtime nicht finden können, eine Klasse mit dem Namen "Dynamodb". Es gibt keine solche Klasse in der AWS-SDK für Java .. der richtige Klassenname ist "DynamoDB". Auf den Unterschied in der Falle zwischen Ihrer Klasse von der Ausnahme-stack-trace und den richtigen Namen.
Habe ich Fix meine Frage von unten folgenden link. Im Grunde muss zum ausführen von mvn package "Schatten:Schatten" - Befehl, um alle Gläser je. https://docs.aws.amazon.com/lambda/latest/dg/java-create-jar-pkg-maven-and-eclipse.html (Spätere Experimente zeigten, dass nur tun, mvn package wäre schon genug, solange der Schatten-plugin definiert pom.xml Datei.)
Die nächste Herausforderung, die ich konfrontiert, ist das Glas zu groß. Ich folgte dem link unten zu zählen dynomaDB, S3, ec2-Komponenten anstatt das gesamte sdk.
https://aws.amazon.com/blogs/developer/managing-dependencies-with-aws-sdk-for-java-bill-of-materials-module-bom/.
Dann muss ich verwenden EnvironmentVariableCredentialsProvider bereitstellen der lambda-Funktion.
Es ist keine Antwort auf die ursprüngliche Frage. Aber ich war vor dem gleichen Problem der Klasse nicht gefunden und gelöst wird es, indem Sie pom.xml an der richtigen Stelle in der Verzeichnisstruktur.
In Android Studio, "src/main/java/.." lebt in den Application-Ordner in das root-Verzeichnis. Ich wurde falsch platzieren der xml-Datei im root direkt.
Wenn ich eine separate Verzeichnisstruktur außerhalb des Android-Projekts und stellte die xml-Datei wie beschrieben hier, das problem war gelöst.