AWS Lambda,java抛出NoClassDefFoundError,由ClassNotFoundException引起,它不是';不要在本地抛出
我最近开始使用AWS Lambda和Java 一直都很顺利,直到我开始用匕首2注射 现在Lambda抛出以下错误:AWS Lambda,java抛出NoClassDefFoundError,由ClassNotFoundException引起,它不是';不要在本地抛出,java,amazon-web-services,jar,aws-lambda,bazel,Java,Amazon Web Services,Jar,Aws Lambda,Bazel,我最近开始使用AWS Lambda和Java 一直都很顺利,直到我开始用匕首2注射 现在Lambda抛出以下错误: { "errorMessage": "dagger/internal/Preconditions", "errorType": "java.lang.NoClassDefFoundError", "stackTrace": [ "com.company.server.user.SignUpActionAws.handler(SignUpActionAws.jav
{
"errorMessage": "dagger/internal/Preconditions",
"errorType": "java.lang.NoClassDefFoundError",
"stackTrace": [
"com.company.server.user.SignUpActionAws.handler(SignUpActionAws.java:27)",
"sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
"sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
"sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
"java.lang.reflect.Method.invoke(Method.java:498)"
],
"cause": {
"errorMessage": "dagger.internal.Preconditions",
"errorType": "java.lang.ClassNotFoundException",
"stackTrace": [
"java.net.URLClassLoader.findClass(URLClassLoader.java:381)",
"java.lang.ClassLoader.loadClass(ClassLoader.java:424)",
"java.lang.ClassLoader.loadClass(ClassLoader.java:357)",
"com.company.server.user.SignUpActionAws.handler(SignUpActionAws.java:27)",
"sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
"sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
"sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
"java.lang.reflect.Method.invoke(Method.java:498)"
]
}
}
但是,在本地运行java-jar myjar.jar
时不会发生这种情况。我还使用jar-tvf-myjar.jar
检查了类是否在那里
我使用Bazel构建
我检查过的其他问题表明,这可能是由于依赖项不可用,但是,类的内容没有依赖项
摘自:
以下是工作区文件:
bind(name = "aws-lambda", actual = "@com_amazonaws_aws_lambda_java_core//jar")
maven_jar(
name = "com_amazonaws_aws_lambda_java_core",
artifact = "com.amazonaws:aws-lambda-java-core:1.1.0"
)
bind(name = "dagger", actual = "@com_google_dagger//jar")
maven_jar(
name = "com_google_dagger",
artifact = "com.google.dagger:dagger:2.5",
)
这里是Action.java(注意,我直接使用前置条件使其成为最小的实现,在我的实际代码中,它在尝试构建组件时失败):
如果运行
bazel build//src/main/com/company:bin_deploy.jar
并将其上载到AWS Lambda函数,则它应该会失败。如果您在本地运行bazel-run//src/main/com/company:bin
或java-jar-bazel-bin/src/main/com/company/bin_-deploy.jar
它将正常工作。这一切都是由于我的jar中的dagger文件夹的权限。所有其他文件夹(例如com、org、mozilla)都有755个,但dagger文件夹没有。我解压缩了我的jar,运行了两个命令将目录转换为755,将文件转换为644,然后将其压缩备份
用于更改权限的命令:
From inside the unzipped directory:
find . -type f -exec chmod 644 {} +
find . -type d -exec chmod 755 {} +
我不知道为什么它是不同的其他目录时,巴泽尔正在建设它。但这就是问题所在
对于未来的Bazel搜索者,以下是我现在使用的genrule:
genrule(
name = "target-aws",
srcs = ["target_deploy.jar"],
outs = ["target-aws.jar"],
cmd = """
unzip -q $< -d t
cd t
find . -type f -exec chmod 644 {} +
find . -type d -exec chmod 755 {} +
zip ../$@ -q -r .
rm -rf t
"""
)
genrule(
name=“target aws”,
srcs=[“target_deploy.jar”],
outs=[“target aws.jar”],
cmd=”“”
解压-q$<-d t
cd-t
查找。-type f-exec chmod 644{}+
查找。-type d-exec chmod 755{}+
zip../$@-q-r。
rm-rft
"""
)
如果您在WinZip中打开jar(或者在Linux上用解压
列出其内容),您是否看到依赖项?他们在正确的地方吗?如果它们不应该在jar中,您是否将它们部署在服务器上的正确位置?是的,所有的类都在那里(包括Premissions类)。它们在正确的位置。就服务器而言,这就是AWS Lambda的用武之地。我将完整的jar(包含所有依赖项)上传到awslambda,然后从那里开始。与此相关的某些内容似乎导致了问题。您的生成依赖项可能被错误地声明。你的构建文件是什么样子的?@DamienMartin guillerez我已经编辑了我的问题,以包含最小的文件。你可以尝试另一种构建技术,以减少你的问题范围。我不熟悉bazel,但我在Lambda的所有工作中都使用了AWS Eclipse插件,发现它可以完美地处理构建/打包依赖关系。您可以尝试使用Eclipse插件构建一个基本的包,然后打开结果,看看它是否能将您带到任何地方。
package com.company;
import com.amazonaws.services.lambda.runtime.Context;
public class Action {
public static void main(String[] s) {
Action.handler(null, null);
}
public static String handler(String request, Context context) {
dagger.internal.Preconditions.checkNotNull(new Object(), "Test");
return null;
}
}
From inside the unzipped directory:
find . -type f -exec chmod 644 {} +
find . -type d -exec chmod 755 {} +
genrule(
name = "target-aws",
srcs = ["target_deploy.jar"],
outs = ["target-aws.jar"],
cmd = """
unzip -q $< -d t
cd t
find . -type f -exec chmod 644 {} +
find . -type d -exec chmod 755 {} +
zip ../$@ -q -r .
rm -rf t
"""
)