【发布时间】:2018-08-07 19:20:36
【问题描述】:
我尝试在本地运行以下代码(作为 IntelliJ 中的 maven 项目)并且运行正常。当我尝试将它作为 Lambda 函数运行时,我总是得到一个 java.lang.NoClassDefFoundError。不知何故,lambda 做到了,所以当我在下面包含 AmazonS3 行时找不到该类。
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();
但没有成功。
【问题讨论】:
标签: java amazon-web-services amazon-s3 aws-lambda aws-sdk