简体   繁体   English

AWS Lambda ClassNotFoundException

[英]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: ClassNotFoundExceptionAWS 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 中。

dependency tree.依赖树。 在此处输入图片说明

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:

  1. remove maven-shade-plugin删除 maven-shade-plugin
  2. I've refereed Official documentation of spring.cloud.io我已经参考了 spring.cloud.io 的官方文档

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 AWS Lambda:ClassNotFoundException - AWS Lambda: ClassNotFoundException AWS Lambda Java 错误:ClassNotFoundException - AWS Lambda Java Error: ClassNotFoundException Lambda - ClassNotFoundException - Lambda - ClassNotFoundException Quarkus GraalVM 本机构建在 AWS Lambda 中失败并出现 ClassNotFoundException - Quarkus GraalVM native build fails in AWS Lambda with ClassNotFoundException AWS Lambda尝试访问dynamoDB时发生运行时错误-ClassNotFoundException - Runtime error when aws lambda trying to access dynamoDB - ClassNotFoundException 无法从AWS Lambda连接到AWS RDS MySql DB。 ClassNotFoundException:com.mysql.jdbc - Not able to connect to AWS RDS MySql DB from AWS Lambda. ClassNotFoundException: com.mysql.jdbc ClassNotFoundException ...$$Lambda$172 - ClassNotFoundException …$$Lambda$172 使用 Bitbucket Pipelines 更新 AWS Java Lambda 函数时出错 - java.lang.ClassNotFoundException - Error when update AWS Java Lambda Function using Bitbucket Pipelines - java.lang.ClassNotFoundException java.lang.ClassNotFoundException 同时在 AWS CDK 代码中引用 Lambda 代码 - java.lang.ClassNotFoundException while referencing Lambda code in AWS CDK code 带有Java的AWS Lambda抛出由ClassNotFoundException引起的NoClassDefFoundError,该异常未在本地抛出 - AWS Lambda with java throwing NoClassDefFoundError caused by ClassNotFoundException which isn't thrown locally
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM