【发布时间】:2015-12-23 08:00:06
【问题描述】:
我在使用基于 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 上加载方法处理程序时出错: 类 java.lang.NoClassDefFoundError java.lang.NoClassDefFoundError: com/amazonaws/services/lambda/runtime/events/SNSEvent 在
java.lang.Class.getDeclaredMethods0(Native Method) 在 java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 在 java.lang.Class.privateGetPublicMethods(Class.java:2902) 在 java.lang.Class.getMethods(Class.java:1615) 原因: java.lang.ClassNotFoundException: com.amazonaws.services.lambda.runtime.events.SNSEvent 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(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.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文件的相关部分吗?我的可比工作 Lambda 函数没有将 aws-lambda-java-events-1.1.0.jar 捆绑在 lib 下,它的 SNSEvent.class 文件松散为 com/amazonaws/services/lambda/runtime/events/SNSEvents.class。
-
我今晚回家后可以,但你的意思是它的 SNSEvent.class 文件“松散”是什么意思?如果不提供运行时环境和库的jar,它是如何工作的?
-
我的项目没有将他们的 jar 捆绑在我的 jar 中。它将我的 jar 中的已编译类与我的代码的已编译类捆绑在类路径文件夹层次结构中。
-
刚刚用我的 pom 文件更新了 OP。您如何将库放在树结构中?谢谢!
-
遗憾的是,我不是专家。我的 pom.xml 与你的类似,但我只有两个依赖项:
aws-lambda-java-core1.0.0 和aws-lambda-java-events1.1.0。
标签: amazon-web-services amazon-sns aws-lambda