[英]AWS Lambda ClassNotFoundException
I am having trouble when lambda function is called on dynamoDB update.在 dynamoDB 更新时调用 lambda 函数时遇到问题。 i have checked AWS Lambda: ClassNotFoundException and AWS Lambda NoClassDefFoundError but no success.
我检查了AWS Lambda: ClassNotFoundException和AWS Lambda NoClassDefFoundError但没有成功。
i am writing this lambda function to call when there is any update in dynamo .我正在编写这个 lambda 函数,以便在 dynamo 中有任何更新时调用。 i followed this tutorial.
我跟着这个教程。 https://docs.aws.amazon.com/lambda/latest/dg/with-dynamodb-create-package.html
https://docs.aws.amazon.com/lambda/latest/dg/with-dynamodb-create-package.html
All the thing have been done successfully but the problem is when i update dynamodb and check the logs for AWS Cloud watch there is an exception.所有的事情都已成功完成,但问题是当我更新 dynamodb 并检查 AWS Cloud watch 的日志时出现异常。
Error loading method handleRequest on class com.amazonaws.lambda.demo.LambdaFunctionHandler: java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: com/amazonaws/services/lambda/runtime/events/DynamodbEvent
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.DynamodbEvent
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 4 more
my java code is.我的java代码是。
package com.amazonaws.lambda.demo;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent.DynamodbStreamRecord;
public class LambdaFunctionHandler implements RequestHandler<DynamodbEvent, String> {
@Override
public String handleRequest(DynamodbEvent ddbEvent, Context context) {
// TODO Auto-generated method stub
for (DynamodbStreamRecord record : ddbEvent.getRecords()){
System.out.println(record.getEventID());
System.out.println(record.getEventName());
System.out.println(record.getDynamodb().toString());
}
return "Successfully processed " + ddbEvent.getRecords().size() + " records.";
}
}
my pom.xml is我的 pom.xml 是
<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.amazonaws.lambda</groupId>
<artifactId>demo</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<forceJavacCompilerUse>true</forceJavacCompilerUse>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-bom</artifactId>
<version>1.11.321</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</project>
i am naming my handler as com.amazonaws.lambda.demo.LambdaFunctionHandler::handleRequest
我将我的处理程序命名为
com.amazonaws.lambda.demo.LambdaFunctionHandler::handleRequest
i have checked all the things are fine but still it is giving me error on com.amazonaws.services.lambda.runtime.events.DynamodbEvent
this class is in aws sdk.我已经检查过所有的东西都很好,但它仍然给我在
com.amazonaws.services.lambda.runtime.events.DynamodbEvent
错误,这个类在 aws sdk 中。
You have to build your project via Maven by using the following command: mvn clean package
.您必须使用以下命令通过 Maven 构建您的项目:
mvn clean package
。 Then go to target
directory where you can find your built jar file.然后转到
target
目录,您可以在其中找到构建的 jar 文件。
When you upload the jar file to AWS Lambda you have to upload the jar file which includes all dependencies ( aws-lambda-java-events
in your example).当您将 jar 文件上传到 AWS Lambda 时,您必须上传包含所有依赖项的 jar 文件(在您的示例中为
aws-lambda-java-events
)。 Please see the screen for your example:请查看您的示例屏幕:
In your case, you have to upload demo-1.0.0.jar
instead of original-demo-1.0.0.jar
.在您的情况下,您必须上传
demo-1.0.0.jar
而不是original-demo-1.0.0.jar
。
If everything's fine, even package name and generated JAR & all and still someone's facing an error then you can add following configurations to the maven-plugin..如果一切正常,即使是包名和生成的 JAR 以及所有内容,但仍然有人面临错误,那么您可以将以下配置添加到 maven-plugin..
instead of maven-shade-plugin, I'm using spring-boot-maven-plugin plugin with following configs.我使用的是带有以下配置的spring-boot-maven-plugin插件,而不是 maven-shade-plugin。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot.experimental</groupId>
<artifactId>spring-boot-thin-layout</artifactId>
<version>1.0.26.RELEASE</version>
</dependency>
</dependencies>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>aws</shadedClassifierName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
and then you can run然后你可以运行
./mvnw clean package
or if you're using STS/Eclipse, then run Maven build.. with goals clean package或者,如果您使用的是 STS/Eclipse,则运行 Maven build.. with targets clean package
This will generate a jar file in KB in your target folder and you can use this JAR to deploy on AWS lambda code.这将在您的目标文件夹中生成一个以 KB 为单位的 jar 文件,您可以使用此 JAR 在 AWS lambda 代码上进行部署。
PS: PS:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.