【问题标题】:AWS Lambda ClassNotFoundExceptionAWS Lambda ClassNotFoundException
【发布时间】:2018-05-07 11:44:47
【问题描述】:

在 dynamoDB 更新时调用 lambda 函数时遇到问题。 我检查过 AWS Lambda: ClassNotFoundException 和 AWS Lambda NoClassDefFoundError 但没有成功。

我正在编写这个 lambda 函数,以便在 dynamo 有任何更新时调用。我按照本教程进行操作。 https://docs.aws.amazon.com/lambda/latest/dg/with-dynamodb-create-package.html

所有事情都已成功完成,但问题是当我更新 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

我的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.";
    }

}

我的 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>

我将我的处理程序命名为com.amazonaws.lambda.demo.LambdaFunctionHandler::handleRequest

我检查了所有的东西都很好,但它仍然给我com.amazonaws.services.lambda.runtime.events.DynamodbEvent这个类在 aws sdk 中的错误。

依赖树。

【问题讨论】:

  • 能否提供maven依赖树:mvn dependency:tree?
  • @ilopezluna 请检查依赖树

标签: java amazon-web-services aws-lambda aws-sdk


【解决方案1】:

您必须使用以下命令通过 Maven 构建您的项目:mvn clean package。然后转到target 目录,您可以在其中找到您构建的jar 文件。

当您将 jar 文件上传到 AWS Lambda 时,您必须上传包含所有依赖项的 jar 文件(在您的示例中为 aws-lambda-java-events)。请查看您的示例屏幕:

在您的情况下,您必须上传 demo-1.0.0.jar 而不是 original-demo-1.0.0.jar。

【讨论】:

  • 我正在使用创建 jar 文件。 Eclipse 中的文件->导出->Jar 文件。我反编译了jar文件,是的,没有依赖关系。如何制作包含所有依赖项的完整 jar 文件
  • 请使用mvn clean package 命令,因为您使用 maven 并且有一个 pom 文件。之后,在你的项目中打开目标目录,你会看到这些文件。
【解决方案2】:

如果一切正常,甚至包名和生成的 JAR & all 仍然有人面临错误,那么您可以将以下配置添加到 maven-plugin..

我使用 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>

然后你就可以运行了

./mvnw clean package

或者,如果您使用的是 STS/Eclipse,则运行 Maven build.. 以 clean package

为目标

这将在您的目标文件夹中生成一个以 KB 为单位的 jar 文件,您可以使用此 JAR 在 AWS lambda 代码上进行部署。

PS:

  1. 移除 maven-shade-plugin
  2. 我已经推荐了 spring.cloud.io 的 Official documentation

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2022-06-14
    • 2019-10-14
    相关资源
    最近更新 更多