java – 使用库运行AWS lambda函数时的NoClassDefFoundError

我们正在开发一个项目,使用由API网关请求触发的lambda函数来处理文件.该函数然后获取S3存储桶中的文件并开始读取它.在此之前,一切都按预期工作,但是当文件读取开始时,我们收到以下错误:

(...)
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file
2017-02-06 19:15:06 <9025af71-eca0-11e6-82d2-9ff4b9184005> ERROR JRestlessHandlerContainer:339 - container failure
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file
END RequestId: (some id)
REPORT RequestId: (some id)  Duration: 3047.44 ms    Billed Duration: 3100 ms        Memory Size: 1536 MB    Max Memory Used: 94 MB  

Exception in thread "main" java.lang.Error: java.lang.NoClassDefFoundError: java/lang/Throwable$WrappedPrintWriter
    at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:59)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)
Caused by: java.lang.NoClassDefFoundError:     java/lang/Throwable$WrappedPrintWriter
    at java.lang.Throwable.printStackTrace(Throwable.java:721)
    at lambdainternal.UserFault.trace(UserFault.java:43)
    at lambdainternal.UserFault.makeUserFault(UserFault.java:26)
    at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:290)
    at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:57)
    ... 3 more
START RequestId: (some id) Version: $LATEST
END RequestId: (some id)

我们使用自己的自定义文件读取/处理库(Java项目),因为文件也是根据我们的需求定制的,我们使用Maven将它添加到我们的项目中.我们的lambda jar是使用Maven Shade插件生成的:

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

在本地测试项目,它工作正常,我们可以获取文件信息.我们的代码使用JAX-RS和Spring来处理API网关(我们不确定这是否会干扰结果).但是,到目前为止,在使用lambda运行项目时,我们无法解决此问题.在我们的测试期间,我们故意增加了函数超时和内存,但无论限制是什么,错误都会持续存在.

先感谢您.

最佳答案 使用日志技术,对我们的代码进行调试并联系AWS支持,我们看到我们的一个库在禁止目录中创建文件,如下所述:
https://aws.amazon.com/lambda/faqs/,因此Lambda函数失败.

他们解释说如果你需要创建文件,你必须使用/ tmp目录,在我们遇到这个问题之前我们没有注意到这一点.我们一遍又一遍地阅读文档,但是这一件事仍然抓住了我们,它发生了,我想.无论如何,在库中更改后,函数现在可以按预期完美地执行.

谢谢大家的帮助.

点赞