上传并运行我的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错误。我确实导入了这些类。然而,我的罐子不包括这些文件,只包括我的课程。我怀疑这是相关的。真的吗?我是否需要为这些"外部"找到亚马逊类替代品?我正在使用的课程?我很困惑。
答案 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