【发布时间】:2018-07-24 00:07:27
【问题描述】:
我正在开发 AWS Lambda 函数。我通过上传一个 zip 文件和用 Java 8 编写的源代码(项目)来部署它。
项目是使用 gradle 构建的。成功构建后,它会生成部署 zip。
当我在 Lambda 函数中部署本地生成的 zip 时,这非常有效。
工作场景:
Zip generated through gradle build locally in workspace -> copied to AWS S3
location -> specify the s3 zip path in Lambda upload/specify URL path field.
但是当我从 jenkins 生成 gradle 构建时,生成的 zip 在 lambda 函数中不起作用。它抛出“类未找到异常”
异常情况:
Zip generated through gradle in Jenkins -> copied to AWS S3 location ->
specify the s3 zip path in Lambda upload/specify URL path field.
Class not found: com.sample.HelloWorld: java.lang.ClassNotFoundException
java.lang.ClassNotFoundException: com.sample.HelloWorld
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
我怀疑这可能是 zip 文件中内容的文件权限问题。我通过比较linux中的两个zip内容来验证这一点 环境。我可以看到 jenkins 生成的 zip 文件缺少一些权限,因此我处理了 zip 内容的权限设置 我的 gradle 构建代码。
task zip(type: Zip) {
archiveName 'lambda-project.zip'
fileMode 0777
from sourceSets.main.output.files.each { zipTree(it) }
from (configurations.runtime) {
into 'lib'
}
}
但我仍然遇到同样的错误。我可以看到文件内容现在具有完全权限,但仍然出现相同的错误。
注意:
尝试将部署包制作为 jar 并进行测试。仍然出现同样的错误。
我已正确配置了 lambda 处理程序配置。示例:类名是“HelloWorld.java”,包名是 com.sample 然后 我的 lambda 处理程序配置是 com.sample.HelloWorld。我对这一点很有信心,因为配置相同 在本地生成 zip 时它工作正常
我对比了 zip 内容(本地生成和 jenkins 生成),看不出它们有什么不同
【问题讨论】:
-
您的目录结构是否在 zip 的根目录中? Python Lambda 函数有一个限制,即文件应位于 zip 的根目录中。不过我不确定 Java。
-
另外,如果你试图访问某些资源,它只能放在 lambda 目录根目录下名为 tmp 的文件夹中
-
你能把用jenkins生成的版本的
unzip -l file.zip的输出贴出来吗? -
@hansaplast 请在存档下方找到 unzip -l 命令的结果: lambda-project.zip 长度日期时间名称 --------- ---------- ----- ---- 0 02-13-2018 11:19 com/ 0 02-13-2018 11:19 com/sample/ 7464 02-13-2018 11:19 com/sample/HelloWorld.class 819 02-13-2018 11:19 com/sample/HelloWorld$1.class 2199 02-13-2018 11:19 application.properties 0 02-13-2018 11:19 lib/ 41203 08-29-2017 17:14 lib/ slf4j-api-1.7.25.jar
-
奇怪,这一切看起来都正确..
标签: amazon-web-services jenkins gradle aws-lambda