【问题标题】:Lambda function throws class not found exception when deployed with Jenkins generated zip file与 Jenkins 生成的 zip 文件一起部署时,Lambda 函数抛出类未找到异常
【发布时间】: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'

        }

    }

但我仍然遇到同样的错误。我可以看到文件内容现在具有完全权限,但仍然出现相同的错误。

注意:

  1. 尝试将部署包制作为 jar 并进行测试。仍然出现同样的错误。

  2. 我已正确配置了 lambda 处理程序配置。示例:类名是“HelloWorld.java”,包名是 com.sample 然后 我的 lambda 处理程序配置是 com.sample.HelloWorld。我对这一点很有信心,因为配置相同 在本地生成 zip 时它工作正常

  3. 我对比了 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


【解决方案1】:

zip 文件中的目录缺少权限。我之前尝试过提供文件权限,但在为 gradle build 中的目录提供权限后它起作用了。

dirMode 0777

【讨论】:

    【解决方案2】:

    我建议使用无服务器框架进行 lambda 部署,无服务器框架帮助我们轻松部署 lambda 函数。但是如果你想设置 CI、CD、监控和日志,那么你可以参考下面的书。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      相关资源
      最近更新 更多