gpt4 book ai didi

java - AWS Lambda Java 到 S3 - com.amazonaws.services.s3.AmazonS3ClientBuilder 上的 java.lang.ClassNotFoundException

转载 作者:行者123 更新时间:2023-11-30 10:18:51 25 4
gpt4 key购买 nike

我尝试在本地运行下面的代码(作为 IntelliJ 中的 maven 项目)并且它运行正常。当我尝试将它作为 Lambda 函数运行时,我总是得到一个 java.lang.NoClassDefFoundError。不知何故,当我在下面包含 AmazonS3 行时,lambda 使它无法找到该类。

package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;

public class ParserLambda implements RequestHandler<Object, Object> {
@Override
public Object handleRequest(Object input, Context context) {
String retval = "";
try {
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();
} catch (Exception ex) {
return "{'status':'error', 'retval': '" + ex.getMessage() + "'}";
}
return "{'status':'done', 'retval': '" + retval + "'}";
}
}

如果我注释掉下面这行

//AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

它给出:"{'status':'done', 'retval': ''}"。这是一个有效的结果。

未注释时

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

我得到:

{
"errorMessage": "com/amazonaws/services/s3/AmazonS3ClientBuilder",
"errorType": "java.lang.NoClassDefFoundError",
"stackTrace": [
"example.ParserLambda.handleRequest(ParserLambda.java:11)",
"sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
"sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
"sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
"java.lang.reflect.Method.invoke(Method.java:498)"
],
"cause": {
"errorMessage": "com.amazonaws.services.s3.AmazonS3ClientBuilder",
"errorType": "java.lang.ClassNotFoundException",
"stackTrace": [
"java.net.URLClassLoader.findClass(URLClassLoader.java:381)",
"java.lang.ClassLoader.loadClass(ClassLoader.java:424)",
"java.lang.ClassLoader.loadClass(ClassLoader.java:357)",
"example.ParserLambda.handleRequest(ParserLambda.java:11)",
"sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
"sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
"sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
"java.lang.reflect.Method.invoke(Method.java:498)"
]
}
}

我的 pom 文件包括:

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.286</version>
</dependency>

我也试过:

AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).withForceGlobalBucketAccessEnabled(true).build();

但没有成功。

最佳答案

我遇到了同样的问题,经过几次不同的尝试后解决了。

在我的 pom.xml 中调整以下依赖项还不够(注意 <scope>provided</scope>aws-java-sdk 的依赖):

<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.664</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.664</version>
</dependency>

原来我在 pom.xml 中缺少以下插件:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

并且我以错误的方式构建了 jar 文件。构建 jar 文件的最佳方法是使用终端或命令提示符导航到项目目录并执行以下命令:

mvn package

这包括您的 jar 文件中所有必需的依赖项。您的 jar 文件将位于 ./target目录。


来源:https://docs.aws.amazon.com/lambda/latest/dg/java-create-jar-pkg-maven-no-ide.html

关于java - AWS Lambda Java 到 S3 - com.amazonaws.services.s3.AmazonS3ClientBuilder 上的 java.lang.ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49020633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com