Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 使用谷歌时';s带有AWS Lambda的自定义搜索库,有';这是一个NoClassDef错误,不会在本地重现_Amazon Web Services_Aws Lambda_Google Custom Search_Google Client - Fatal编程技术网

Amazon web services 使用谷歌时';s带有AWS Lambda的自定义搜索库,有';这是一个NoClassDef错误,不会在本地重现

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" } 以

我创建了一个jar,添加了一个主类,并使用java-jar运行它。这是正常执行的,但当我将其上传到AWS Lambda时,我得到以下信息:

{
"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
    }           
}