amazon-web-services - AWS Lambda NoClassDefFoundError

标签 amazon-web-services amazon-sns aws-lambda

我在使用基于Java的Lambda函数设置以接收来自SNS的消息时遇到困难。我的函数如下所示:

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函数引发以下异常:

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)



我使用Maven + Netbeans,这是一个Maven Java应用程序项目。我从Lambda控制台下载了该函数,并确认该jar具有一个lib /目录,其中包含所有要导入的jar,包括aws-lambda-java-events-1.1.0.jar,其本身包含/ com / amazonaws /services/lambda/runtime/events/SNSEvent.class文件。

为什么肯定在jar文件中的类无法在运行时找到该类?我还需要做其他事情,设置任何环境变量等吗?

任何帮助,将不胜感激!

编辑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>

最佳答案

使用maven-shade plugin,以便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

关于amazon-web-services - AWS Lambda NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32782980/

相关文章:

amazon-web-services - AWS ECS动态端口映射+nginx+app

javascript - Nodejs 和 aws-sdk : Simultaneous access to multiple regions?

amazon-web-services - 通过AWS EKS进行KOPS或反之亦然

ios - 在开发人员配置文件和分发配置文件之间切换

node.js - 无法让 nodejs 在 amazon ec2 实例上工作

c# - Amazon Simple Notification Service "push"可以通知到桌面客户端吗?

android - 如何做 SNS 推送通知? CreatePlatformEndpointResult 返回 null

angular - AWS Lambda@Edge 将查询字符串附加到响应

node.js - Alexa 日历 : Amazon Lambda local vs UTC timezone mismatch

node.js - 如何在 AWS Lambda 中使用 Nodejs "request"work aysn?