我们正在开发一个项目,使用由API Gateway请求触发的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将其添加到了我们的项目中。我们使用Maven Shade插件生成了lambda jar包:
<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上运行项目时出现的问题。在我们的测试中,我们故意增加了函数超时时间和内存限制,但无论限制如何,错误仍然存在。
提前感谢您。