使用库运行AWS lambda函数时出现NoClassDefFoundError
我们正在开发一个项目,以使用由API网关请求触发的lambda函数来处理文件。该功能然后将文件存入S3存储桶并开始读取。直到这个点,一切正常像预期,但在文件读取开始我们收到以下错误:使用库运行AWS lambda函数时出现NoClassDefFoundError
(...)
/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的阴影插件生成我们的拉姆达的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运行项目时,我们无法解决这个问题。在我们的测试中,我们特意增加了功能超时和内存,但不管限制如何,错误依然存在。
预先感谢您。
使用日志技术,调试我们的代码并联系AWS支持,我们发现其中一个库正在禁止目录中创建文件,如下所述:https://aws.amazon.com/lambda/faqs/,因此Lambda函数失败。
他们解释说,如果你需要创建文件,你必须使用/ tmp目录,我们没有注意到这一点,直到我们有这个问题。我们一遍又一遍地阅读文档,但这一件事仍然引起我们的注意,我认为它发生了。无论如何,在库中更改此函数后,函数现在可以按预期完美执行。
谢谢大家的帮助。
您能否指出常见问题解答中的具体问题?我无法通过浏览找到它。 –
好吧,我也找不到它(这很奇怪,但我相信自从上次看到它以后他们已经更新了该页面)。无论如何,我发现这个有用的链接:https://docs.aws.amazon.com/lambda/latest/dg/limits。html搜索'/ tmp目录可用于...' –
你能显示你的整个pom.xml文件吗?你有没有看到这个:http://docs.aws.amazon.com/lambda/latest/dg/java-create-jar-pkg-maven-no-ide.html – Zigglzworth
这里显示的这个“容器故障”确实可以表明该错误在AWS端。您应该将其发送给他们的支持团队或AWS论坛。 –
嗨@JeshanBabooa,这也是我们所怀疑的。我们已经在AWS论坛上发布了这个问题,但直到现在我们还没有答案,并决定在这里发布。 –