web-dev-qa-db-fra.com

AWS Lambda NoClassDefFoundError

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>
21
Brooks

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

16
Mike76

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>
2
Alejandro Garcia

=== 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.

1
barath

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>

0
user3165739