web-dev-qa-db-ja.com

AWS Lambda NoClassDefFoundError

Javaに基づいてSNSからメッセージを受信するLambda関数のセットアップに問題があります。私の関数は次のようになります。

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
    }
}

コンパイルは問題なく、jarファイルをLambdaに(Webコンソール経由で)アップロードするのに問題はありません。

ただし、SNSEventモデルを表すJSONを使用して(SNS経由でサブスクライブされたLambda関数まで)公開すると、Lambda関数は次​​の例外をスローします。

クラスcom.mycompany.LambdaHandlerのメソッドハンドラーのロードエラー:クラス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)原因: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)

Maven + Netbeansを使用しており、Maven Java Applicationプロジェクトです。Lambdaコンソールから関数をダウンロードして確認しました。jarには、インポート用のすべてのjar aws-lambda-Java-events-1.1.0.jar。これには/com/amazonaws/services/lambda/runtime/events/SNSEvent.classファイルが含まれます。

クラスがjarファイル内にある場合、ランタイムがクラスを見つけられないのはなぜですか?環境変数などを設定する必要がありますか?

助けていただければ幸いです!

EDIT 1 aws-lambda-Java-events 1.0.0にダウングレードしようとしましたが、引き続き同じ例外が報告されています。要求されたとおり、以下は私のPOMファイルです(プロジェクト名だけが変更されています)。ライブラリをツリー構造に配置するようにMavenに指示する方法がわかりません。

<?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>
27
Brooks

maven-shadeプラグイン を使用して、JARにuber-jarの依存関係が含まれるようにします。

したがって、これを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>

ソース: http://docs.aws.Amazon.com/lambda/latest/dg/Java-create-jar-pkg-maven-no-ide.html

この問題が発生する可能性があります https://github.com/aws/aws-lambda-Java-libs/issues/2 aws-lambda-Java-events-1.0.0へのダウングレードが必要です.jar

21
Mike76

===シェーディングされたjarを含めた後でもこの問題が存在する場合===

シェーディングjarを作成した後でもこの問題が発生する場合、問題はaws-lambda-Java-eventsパッケージバージョンに関連する必要があります(AWS lamdaバージョンと新しいaws-lambda-Java-eventsバージョン)。つまり、aws-lambda-Java-eventsパッケージの最新バージョン(2.0.2)でこの問題が発生し、バージョンを1.3.0にダウングレードする必要があります。

新しいaws-lambda-Java-eventsバージョンには多くの依存関係がないようです。

2
barath

ラムダを再度アップロードする必要がある場合があります。また、この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

Pom.xmlのpluginsセクションで、 Apache Maven Shade Plugin を追加します。これはビルドプロセス中に使用されます。このプラグインは、jarをパッケージ化してスタンドアロンの.jarを作成するために使用されます。maven-shade-pluginは、パッケージgoalによって生成されたアーティファクト(jar)を取得し、コンパイルされたコードとpom.xml。

<dependency>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
0
user3165739