我很难使用基于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函数抛出以下异常:
在类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 at java.lang.Class.privateGetPublicMethods(Class.java:2902)at 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有一个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>
答案 0 :(得分:19)
使用maven-shade plugin,以便JAR包含超级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
答案 1 :(得分:2)
有时你必须再次上传你的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>
答案 2 :(得分:2)
===如果在包含阴影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 版本没有很多依赖项。
答案 3 :(得分:0)
在pom.xml的plugins部分中,添加Apache Maven Shade Plugin。在构建过程中使用它。这个插件用于打包jar以创建一个独立的.jar.maven-shade-plugin将获取由包目标生成的工件(jar),并创建一个包含已编译代码的独立.jar,以及来自pom.xml中。
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
答案 4 :(得分:0)
如果您有<scope>provided</scope>
在aws-lambda-java-events工件中,将其删除。