[英]AWS Lambda: ClassNotFoundException
目前,每當我嘗試在 AWS Lambda 上測試我的 Lambda 函數時,都會收到 ClassNotFoundException。 此處顯示異常:
我在網上搜索過,包括這里的鏈接: AWS Lambda: class java.lang.ClassNotFoundException ,但無濟於事。
我在 Android Studio 中工作並創建了一個 JAR 文件(使用此鏈接: How to make a .jar out from an Android Studio project )用於將類上傳到 AWS Lambda 控制台。
以下是我的項目結構:
當我將 JAR 文件上傳到 AWS Lambda 控制台時,配置選項卡如下所示:[
之前有人告訴我,這可能是因為我的 JAR 文件不是帶有 MANIFEST.MF 文件的可執行 JAR 文件,但我確實有。
關於為什么會不斷彈出此錯誤以及如何修復它的任何其他原因?
您的處理程序需要包含完整的 Java 包。 在您的示例中,您需要將處理程序設為:
edu.csulb.android.riseandshine.Dynamodb::handleRequest
這是在您當前擁有Dynamodb::handleRequest
的 Lambda 屏幕上配置的
編輯
我的“hello world”Lambda 如下所示。 請注意,這是一個 maven 項目,因此代碼必須位於 maven 期望的位置。 在您正在開發的目錄的“根”處是 pom.xml 文件(如下),Java 文件需要位於src/main/java/com/hotjoe/aws/lambda/hello/handler
。
一旦你安裝了它並安裝了 maven,運行mvn clean package
。 可部署的 jar 將是target/hello-world-lambda-1.0-SNAPSHOT.jar
。 我剛剛將它部署到 Lambda 並可以通過測試運行它:
{
"key3": "value3",
"key2": "value2",
"key1": "value1"
}
這是 Lambda 測試的默認設置。 這一切都取自有關創建部署的AWS 文檔。 在我的示例中,Lambda 處理程序是com.hotjoe.aws.lambda.hello.handler.HelloWorldLambdaHandler::handleRequest
。
我使用的代碼如下。
HelloWorldLambdaHandler.java
package com.hotjoe.aws.lambda.hello.handler;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
@SuppressWarnings("unused")
public class HelloWorldLambdaHandler implements RequestHandler<HelloWorldLambdaHandler.InputObject, String> {
public String handleRequest(InputObject inputObject, Context context) {
System.out.println( "got \"" + inputObject + "\" from call" );
return "{\"result\": \"hello lambda java\"}";
}
public static class InputObject {
private String key1;
private String key2;
private String key3;
public String getKey1() {
return key1;
}
public String getKey2() {
return key2;
}
public String getKey3() {
return key3;
}
public void setKey1(String key1) {
this.key1 = key1;
}
public void setKey2(String key2) {
this.key2 = key2;
}
public void setKey3(String key3) {
this.key3 = key3;
}
@Override
public String toString() {
return "InputObject{" +
"key1='" + key1 + '\'' +
", key2='" + key2 + '\'' +
", key3='" + key3 + '\'' +
'}';
}
}
}
pom.xml:
<?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.hotjoe.aws.lambda.hello</groupId>
<artifactId>hello-world-lambda</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
堆棧跟蹤表明 Java 運行時找不到名為“Dynamodb”的類。 AWS SDK for Java 中沒有這樣的類。正確的類名是“DynamoDB”。 請注意異常堆棧跟蹤中的類與正確名稱之間的大小寫差異。
我通過以下鏈接解決了我的問題。 基本上需要運行 mvn "package shade:shade" 命令來包含所有依賴的 jars。 https://docs.aws.amazon.com/lambda/latest/dg/java-create-jar-pkg-maven-and-eclipse.html (后來的實驗表明,只要做 mvn package 就足夠了,只要陰影pom.xml 文件中定義的插件。)
我面臨的下一個挑戰是罐子太大了。 我按照以下鏈接包含 dynomaDB、S3、ec2 組件而不是整個 sdk。 https://aws.amazon.com/blogs/developer/managing-dependencies-with-aws-sdk-for-java-bill-of-materials-module-bom/ 。
然后我需要使用 EnvironmentVariableCredentialsProvider 部署到 lambda 函數。
這不是原始問題的答案。 但是我遇到了同樣的問題,找不到類,並通過將 pom.xml 放在目錄結構中的正確位置來解決它。 在 Android Studio 中,“src/main/java/..”位於根目錄下的 Application 文件夾中。 我錯誤地將xml文件直接放在根目錄中。
當我在 Android 項目之外創建了一個單獨的目錄結構並按照這里的描述放置了 xml 文件時,問題就解決了。
我知道現在分享解決方案為時已晚,
但我在 2021 年 4 月面臨的同樣問題,這些答案都不適用於我的案例。 所以我正在分享我是如何修復它的,它可能會對某人有所幫助。
我通過添加以下帶有spring-boot-thin-layout 的maven 插件來創建一個瘦 jar 來解決它。
<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 干凈的包
或者,如果您使用的是 STS/Eclipse,則運行 Maven build.. with目標清理包
這將在您的目標文件夾中生成一個以 KB 為單位的 jar 文件,您可以使用此 JAR 在 AWS lambda 代碼上進行部署。
PS:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.