使用库运行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运行项目时,我们无法解决这个问题。在我们的测试中,我们特意增加了功能超时和内存,但不管限制如何,错误依然存在。

预先感谢您。

+0

你能显示你的整个pom.xml文件吗?你有没有看到这个:http://docs.aws.amazon.com/lambda/latest/dg/java-create-jar-pkg-maven-no-ide.html – Zigglzworth

+0

这里显示的这个“容器故障”确实可以表明该错误在AWS端。您应该将其发送给他们的支持团队或AWS论坛。 –

+0

嗨@JeshanBabooa,这也是我们所怀疑的。我们已经在AWS论坛上发布了这个问题,但直到现在我们还没有答案,并决定在这里发布。 –

你还有问题吗?可能是因为您正在使用的特定区域中正在维护Lambda服务。这个错误告诉我JRE已损坏,并且无法访问rt.jar提供的库。必要时联系支持。您可以检查AWS健康here

+0

嗨,是的,错误依然存在。我们仍在寻找解决方案。 –

+0

不确定反对票。我们在过去与兰姆达斯有类似的问题,他们自己解决。就像我说的,如果您因使用服务和获取错误而被收费,请联系支持人员。 – Nektie

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

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

谢谢大家的帮助。

+0

您能否指出常见问题解答中的具体问题?我无法通过浏览找到它。 –

+1

好吧,我也找不到它(这很奇怪,但我相信自从上次看到它以后他们已经更新了该页面)。无论如何,我发现这个有用的链接:https://docs.aws.amazon.com/lambda/latest/dg/limits。html搜索'/ tmp目录可用于...' –