J'ai des difficultés avec la configuration d'une fonction Lambda basée sur Java pour recevoir des messages de SNS. Ma fonction ressemble à celle ci-dessous:
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
}
}
Il se compile parfaitement et je n’ai aucun problème pour télécharger le fichier jar sur Lambda (via la console Web).
Cependant, lorsque je publie sur celui-ci (via SNS jusqu'à la fonction Lambda souscrite) avec JSON représentant le modèle SNSEvent, la fonction Lambda lève l'exception suivante:
Erreur lors du chargement du gestionnaire de méthodes sur la classe com.mycompany.LambdaHandler: classe Java.lang.NoClassDefFoundError Java.lang.NoClassDefFoundError: com/amazonaws/services/lambda/runtime/events/SNSEvent à
Java.lang.Class.getDeclaredMethods0 (méthode native) à Java.lang.Class.privateGetDeclaredMethods (Class.Java:2701) à l'adresse Java.lang.Class.privateGetPublicMethods (Class.Java:2902) à Java.lang.Class.getMethods (Class.Java:1615) Causée par: Java.lang.ClassNotFoundException: com.amazonaws.services.lambda.runtime.events.SNSEvent à Java.net.URLClassLoader.findClass (URLClassLoader.Java:381) à Java.lang.ClassLoader.loadClass (ClassLoader.Java:424) à l'adresse Java.lang.ClassLoader.loadClass (ClassLoader.Java:357)
J'utilise Maven + Netbeans et c'est un projet d'application Java Maven. J'ai téléchargé la fonction à partir de la console Lambda et confirmé, le jar contient un répertoire lib/avec tous les jar pour les importations, y compris aws-lambda-Java-events-1.1.0.jar, qui inclut lui-même le répertoire/com/amazonaws. /services/lambda/runtime/events/SNSEvent.class.
Pourquoi le moteur d’exécution ne parvient-il pas à trouver la classe alors qu’elle est définitivement dans le fichier jar? Y a-t-il autre chose que je doive faire, définir des variables d'environnement, etc.?
Toute aide serait appréciée!
EDIT 1 J'ai essayé de passer à aws-lambda-Java-events 1.0.0 et il signale toujours la même exception. Comme demandé, voici mon fichier POM (avec seulement le nom du projet modifié). Je ne sais pas comment dire à Maven de placer les bibliothèques dans une arborescence.
<?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>
Utilisez le plugin maven-shade pour que le fichier JAR contienne les dépendances dans un uber-jar.
Alors, ajoutez ceci à votre pom.xml
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
Source: http://docs.aws.Amazon.com/lambda/latest/dg/Java-create-jar-pkg-maven-no-ide.html
Vous pourriez éventuellement avoir ce problème https://github.com/aws/aws-lambda-Java-libs/issues/2 qui nécessite une mise à niveau vers aws-lambda-Java-events-1.0.0.jar
Parfois, vous devez télécharger votre lambda à nouveau. De plus, j'ai le même problème que j'ai résolu avec ce pom.xml:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-Java-sdk-bom</artifactId>
<version>1.11.83</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
=== Si ce problème existe même après l’inclusion du fichier jar ombré ===
Si vous rencontrez ce problème même après avoir ombré jar, le problème doit être lié à aws-lambda-Java-events version du paquet (il devrait y avoir une incompatibilité entre la version d'AWS lamda et les nouveaux événements aws-lambda-Java version) . c'est-à-dire que j'ai eu ce problème avec la dernière version (2.0.2) du paquet aws-lambda-Java-events et que je dois rétrograder la version à 1.3.0.
On dirait que la nouvelle version de aws-lambda-Java-events ne comporte pas beaucoup de dépendances.
Dans la section plugins de votre fichier pom.xml, ajoutez le Apache Maven Shade Plugin . Il est utilisé pendant le processus de construction. Ce plugin est utilisé pour créer des fichiers jar autonomes. Le maven-shade-plugin utilisera des artefacts (jars) produits par l’objectif du package et créera un fichier .jar autonome contenant le code compilé et les dépendances résolues à partir du fichier. pom.xml.
<dependency>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>