AWS lambda JAVA:外部库的使用

时间:2017-01-02 01:28:15

标签: java amazon-web-services aws-lambda

上传并运行我的java .jar文件后,我收到警告和错误。 警告是:

This function contains external libraries. Uploading a new file will override these libraries.

错误是:

java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpUriRequest
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)   

我可以构建jar没问题,所有依赖都在我的pom中。我有一些我正在使用的库,比如org.json,它也会抛出相同的java.lang.NoClassDefFoundError错误。我确实导入了这些类。然而,我的罐子不包括这些文件,只包括我的课程。我怀疑这是相关的。真的吗?我是否需要为这些"外部"找到亚马逊类替代品?我正在使用的课程?我很困惑。

4 个答案:

答案 0 :(得分:7)

Amazon Lambda不会为您下载您的依赖项。它希望您的部署文件包含运行Lambda函数所需的所有依赖项。您需要切换到使用zip部署方法,该方法允许您包含多个jar文件(您的Lambda函数jar和所有依赖项jar)。按照here的说明进行操作。

答案 1 :(得分:3)

另一种选择是创建一个胖jar文件。这是一个已包含所有依赖项的jar。部署此类文件会更大,但更易于管理。我建议你使用像Maven这样的构建工具来构建一个胖罐。

答案 2 :(得分:0)

除了普通的依赖关系树之外,只需在pom.xml中的dependencyManagement>依赖关系>依赖关系标记中包含依赖关系jar。那也会造成胖罐。

答案 3 :(得分:0)

也许这有点迟了,但是如果您使用Gradle,则需要运行shadowJar任务,该任务将生成一个包含所有必需依赖项的胖jar。

例如./gradlew shadowJar

或者如果您使用serverless,则可以使用./gradlew deploy的{​​{1}}任务,具体取决于deploy,它将部署整个堆栈。

我在项目shadowJar脚本中做了一个简单的任务来帮助我解决这个问题:

build.gradle

要使用它,您需要致电task deployF() { group = 'serveless' dependsOn = ['shadowJar'] def functionName = project.findProperty("fun") doLast { exec { commandLine 'serverless', 'deploy', '-f', functionName } } } 这将构建jar文件并将所选函数部署到 lambda