我很难使用基于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(通过网络控制台)没有任何问题。
但是,当我使用代表SNSEvent模型的JSON发布到它(通过SNS发布到订阅的Lambda函数)时,Lambda函数抛出以下异常:
在类com上加载方法处理程序时出错。我的公司。LambdaHandler:java类。NoClassDefFoundErrorJava。lang.NoClassDefFoundError:com/amazonaws/services/lambda/runtime/events/SNSEvent at
java.lang.Class.getDeclared方法0(本机方法)java.lang.Class.privateGetDeclared方法(Class.java:2701)java.lang.Class.privateGetPublic方法(Class.java:2902)java.lang.Class.get方法(Class.java:1615)引起:java.lang.ClassNotFoundExcture:com.amazonaws.services.lambda.runtime.events.SNSEent atjava.net.URLClassLoader.find(URLClassLoader.java:381)atjava.lang.ClassLoader.load类(ClassLoader.java:424)在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。类文件。
为什么运行时无法找到类,而它肯定在jar文件中?我还需要做什么吗,设置任何环境变量,等等?
任何帮助都将不胜感激!
编辑1我试图降级到AWS-lambda-java-event1.0.0,它仍然报告相同的异常。根据要求,下面是我的POM文件(仅更改了项目名称)。我不知道如何告诉马文把库放在树状结构中。
<?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>
===如果这个问题存在,即使包括阴影罐===
如果您在使用shaded jar之后仍然存在此问题,则该问题应该与AWS-lambda-java-event包版本相关(AWS lamda版本和较新的AWS-lambda-java-event版本之间应该存在一些不兼容)。我有这个问题的最新版本(2.0.2)的AWS-lambda-java-event包,我不得不降级到1.3.0版本。
似乎较新的aws-lambda-java事件版本没有很多依赖项。
有时你必须再次上传你的lambda。我也得到了同样的问题,我修复了这个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>
使用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>
</build>
资料来源: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