Amazon web services 使用谷歌时';s带有AWS Lambda的自定义搜索库,有';这是一个NoClassDef错误,不会在本地重现
我创建了一个jar,添加了一个主类,并使用java-jar运行它。这是正常执行的,但当我将其上传到AWS Lambda时,我得到以下信息:Amazon web services 使用谷歌时';s带有AWS Lambda的自定义搜索库,有';这是一个NoClassDef错误,不会在本地重现,amazon-web-services,aws-lambda,google-custom-search,google-client,Amazon Web Services,Aws Lambda,Google Custom Search,Google Client,我创建了一个jar,添加了一个主类,并使用java-jar运行它。这是正常执行的,但当我将其上传到AWS Lambda时,我得到以下信息: { "errorMessage": "Error loading class com.me.MyHandler:com/google/api/client/googleapis/json/GoogleJsonResponseException", "errorType": "class java.lang.NoClassDefFoundError" } 以
{
"errorMessage": "Error loading class com.me.MyHandler:com/google/api/client/googleapis/json/GoogleJsonResponseException",
"errorType": "class java.lang.NoClassDefFoundError"
}
以下是日志输出:
Error loading class com.me.MyHandler: com/google/api/client/googleapis/json/GoogleJsonResponseException: class java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: com/google/api/client/googleapis/json/GoogleJsonResponseException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
Caused by: java.lang.ClassNotFoundException: com.google.api.client.googleapis.json.GoogleJsonResponseException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
我打开罐子的拉链,找到了GoogleJsonResponseException.class。AWS的执行环境有什么奇怪的地方吗?即使我没有使用Google的异常,我似乎在每个Google类中都会遇到错误
这是build.gradle文件
group 'com.me'
version '1.0.1'
apply plugin: 'java'
apply plugin: 'application'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile group: 'com.amazonaws', name: 'aws-lambda-java-core', version: '1.1.0'
compile group: 'com.amazonaws', name: 'aws-lambda-java-log4j', version: '1.0.0'
compile group: 'com.google.api-client', name: 'google-api-client', version: '1.22.0'
compile group: 'log4j', name: 'log4j', version: '1.2.17'
compile group: 'com.google.apis', name: 'google-api-services-customsearch', version: 'v1-rev54-1.22.0'
compile group: 'com.google.http-client', name: 'google-http-client-gson', version: '1.22.0'
compile group: 'com.google.http-client', name: 'google-http-client', version: '1.22.0'
compile group: 'com.google.api-client', name: 'google-api-client', version: '1.22.0'
compile group: 'commons-io', name: 'commons-io', version: '2.5'
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.0.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.6.2'
runtime 'com.google.api-client:google-api-client:1.22.0'
}
mainClassName = "com.me.Main"
jar {
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
manifest {
attributes 'Main-Class': mainClassName
}
}
以下是主要方法:
public class Main {
public static void main(String[] args) {
System.out.println("starting main");
MyHandler myHandler = new MyHandler();
myHandler.handleRequest(null, null);
}
}
下面是调用谷歌lib的代码:
public class MyHandler implements
RequestHandler<Map, String> {
static final Logger log = Logger.getLogger(MyHandler.class);
@Override
public String handleRequest(Map input, Context context) {
log.info("Handling request.");
try {
log.info("Initializing custom search");
Customsearch.Builder builder = new Customsearch.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
new GsonFactory(),
null);
builder.setGoogleClientRequestInitializer(new CustomsearchRequestInitializer("test"));
builder.setApplicationName("testQuery");
Customsearch customsearch = builder.build();
Customsearch.Cse.List list = customsearch.cse().list("test");
list.setKey("test");
list.setCx("test");
Search results;
try {
results = list.execute();
} catch (GoogleJsonResponseException gjre) {
log.error(gjre.getMessage());
throw gjre;
}
} catch (IOException e) {
e.printStackTrace();
} catch (GeneralSecurityException gse) {
gse.printStackTrace();
}
return "test";
}
}
公共类MyHandler实现
请求处理程序{
静态最终记录器log=Logger.getLogger(MyHandler.class);
@凌驾
公共字符串handleRequest(映射输入、上下文){
log.info(“处理请求”);
试一试{
log.info(“初始化自定义搜索”);
Customsearch.Builder=新建Customsearch.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
新的GsonFactory(),
无效);
setGoogleClientRequestInitializer(新的CustomsearchRequestInitializer(“测试”);
setApplicationName(“testQuery”);
Customsearch Customsearch=builder.build();
Customsearch.Cse.List List=Customsearch.Cse().List(“测试”);
列表。设置键(“测试”);
列表。setCx(“测试”);
搜索结果;
试一试{
结果=list.execute();
}捕获(GoogleJsonResponseException gjre){
log.error(gjre.getMessage());
投掷gjre;
}
}捕获(IOE异常){
e、 printStackTrace();
}捕获(一般安全例外gse){
gse.printStackTrace();
}
返回“测试”;
}
}
我给AWS开了一张支持票,并找到了解决问题的方法。看起来胖罐子步骤没有完全打包所有东西。相反,他们建议上传一个构建zip(将其添加到gradle文件的末尾):
我添加了这个,并上传了zip而不是jar。工作正常。也将依赖项打包到jar。它打包在这里:configurations.compile.collect{It.isDirectory()?It:zipTree(It)}。使用java-jar执行代码没有问题。此外,我解压了jar并找到了有问题的类文件。
task buildZip(type: Zip) {
from compileJava
from processResources
into('lib') {
from configurations.runtime
}
}