Java 使用库运行AWS lambda函数时出现NoClassDefFoundError

Java 使用库运行AWS lambda函数时出现NoClassDefFoundError,java,amazon-web-services,aws-lambda,Java,Amazon Web Services,Aws Lambda,我们正在开发一个项目,使用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-9ff

我们正在开发一个项目,使用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)
(…)
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar:读取zip文件时出错
2017-02-06 19:15:06错误JRestlesshandler容器:339-容器故障
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar:读取zip文件时出错
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar:读取zip文件时出错
结束请求id:(某些id)
报告请求id:(某些id)持续时间:3047.44毫秒计费持续时间:3100毫秒内存大小:1536 MB最大使用内存:94 MB
线程“main”java.lang.Error中出现异常:java.lang.NoClassDefFoundError:java/lang/Throwable$WrappedPrintWriter
在lambdainternal.AWSLambda.(AWSLambda.java:59)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:348)
位于lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)
原因:java.lang.NoClassDefFoundError:java/lang/Throwable$WrappedPrintWriter
位于java.lang.Throwable.printStackTrace(Throwable.java:721)
位于lambdainternal.UserFault.trace(UserFault.java:43)
位于lambdainternal.UserFault.makeUserFault(UserFault.java:26)
在lambdainternal.AWSLambda.startRuntime(AWSLambda.java:290)
在lambdainternal.AWSLambda.(AWSLambda.java:57)
... 3个以上
START RequestId:(某些id)版本:$LATEST
结束请求id:(某些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>

org.apache.maven.plugins
maven阴影插件
2.3
假的
包裹
阴凉处
在本地测试该项目,它运行良好,我们可以获得文件信息。我们的代码使用JAX-RS和Spring来处理API网关(我们不确定这是否会影响结果)。但是,直到现在,在使用lambda运行项目时,我们还不能解决这个问题。在我们的测试中,我们故意增加了函数超时和内存,但不管限制是什么,错误仍然存在


提前谢谢。

您还有问题吗?可能是Lambda服务正在您使用的特定区域中维护。此错误告诉我JRE已损坏,无法访问rt.jar提供的库。如有必要,请联系支持部门。您可以检查AWS的运行状况。

使用日志技术,调试我们的代码并联系AWS支持人员,我们发现我们的一个库正在一个禁止目录中创建文件,如下所述:,因此Lambda函数失败

他们解释说,如果需要创建文件,就必须使用/tmp目录,直到出现这个问题,我们才注意到这一点。我们一次又一次地阅读文档,但这件事仍然抓住了我们,我想这是经常发生的。无论如何,在库中更改此项后,函数现在可以按预期完美执行


谢谢大家的帮助。

能否显示整个pom.xml文件?您看到了吗:这里显示的“容器故障”确实表明错误在AWS方面。你应该把这个带到他们的支持团队或AWS论坛。嗨@JeshanBabooa,这也是我们怀疑的。我们已经在AWS论坛上发布了这个问题,但直到现在我们还没有答案,决定也在这里发布。嗨@Zigglzworth,很遗憾我不能发布整个pom.xml,但是在我们添加文件处理库之前,我们的函数运行得很好,建议的生成jar的插件与我们使用的插件相同。当您在本地机器上构建项目时,您这样做了(对吗?),但可能在某些地方使用了一些本机依赖项。因此,尝试旋转一个AmazonLinuxEC2实例,并在那里构建java项目。然后将其上传到lambda函数hi,是的,错误仍然存在。我们仍在寻找解决方案。不确定是否会投反对票。我们过去在兰博达斯也遇到过类似的问题,他们自己解决了。如我所说,如果您因使用该服务和出错而被收取费用,请联系支持部门。您能指出常见问题解答中的特定问题吗?我通过浏览找不到它。嗯,我也找不到它(这很奇怪,但我相信自从我上次看到它以来,他们已经更新了页面)。无论如何,我找到了另一个有用的链接:搜索类似于“可以使用/tmp目录…”的内容