Ich habe Schwierigkeiten mit einer Java-basierten Lambda-Funktion, um Nachrichten von SNS zu empfangen. Meine Funktion sieht wie folgt:AWS Lambda NoClassDefFoundError
package com.mycompany;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.events.SNSEvent;
public class LambdaHandler {
public void Handler(SNSEvent event, Context context) {
//Process the event
}
}
Es kompiliert ganz gut, und ich habe keine Probleme die JAR-Datei zu Lambda Hochladen (über die Web-Konsole).
Wenn jedoch ich es (über SNS bis zur gezeichneten Lambda-Funktion) veröffentlichen mit JSON das SNSEvent Modell darstellt, löst die Lambda-Funktion die folgende Ausnahme:
Error loading method handler on class com.mycompany.LambdaHandler: class java.lang.NoClassDefFoundError java.lang.NoClassDefFoundError: com/amazonaws/services/lambda/runtime/events/SNSEvent at
java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.privateGetPublicMethods(Class.java:2902) at java.lang.Class.getMethods(Class.java:1615) Caused by: java.lang.ClassNotFoundException: com.amazonaws.services.lambda.runtime.events.SNSEvent at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
I verwenden Maven + Netbeans und es ist ein Maven Java Anwendungsprojekt. Ich habe die Funktion von der Lambda-Konsole heruntergeladen und bestätigt, dass das jar über ein lib/-Verzeichnis mit allen Jars für die Importe verfügt, einschließlich aws-lambda-java-events-1.1.0.jar, das selbst die/com/amazonaws enthält /services/lambda/runtime/events/SNSEvent.class Datei.
Warum kann die Laufzeitumgebung die Klasse nicht finden, wenn sie definitiv in der JAR-Datei enthalten ist? Muss ich noch etwas anderes tun, irgendwelche Umgebungsvariablen setzen usw.?
Jede Hilfe wäre willkommen!
EDIT 1 Ich versuchte aws-Lambda-java-1.0.0 Ereignisse und es ist die Berichterstattung immer noch die gleiche Ausnahme Herabstufung. Wie unten angegeben, ist meine POM-Datei (mit nur geändertem Projektnamen). Ich weiß nicht, wie ich Maven sagen soll, dass er die Bibliotheken in eine Baumstruktur einfügen soll.
<?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.app</groupId>
<artifactId>Handler</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-lambda</artifactId>
<version>1.10.6</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
Können Sie den relevanten Abschnitt Ihrer Maven-Datei teilen? Meine vergleichbare funktionierende Lambda-Funktion bündelte die aws-lambda-java-events-1.1.0.jar nicht unter lib, sondern hatte die SNSEvent.class-Datei als com/amazonaws/services/lambda/runtime/events/SNSEvents.class. – James
Ich kann heute Abend, wenn ich nach Hause komme, aber was meinst du damit hat die SNSEvent.class-Datei "loose"? Wie funktioniert es, wenn es die Laufzeitumgebung nicht mit dem jar der Bibliothek bereitstellt? – Brooks
Mein Projekt bündelt das Glas nicht in meinem Glas. Es bündelt die kompilierten Klassen in meinem Jar in der Klassenpfad-Ordnerhierarchie neben den kompilierten Klassen für meinen Code. – James