Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWS Lambda,java抛出NoClassDefFoundError,由ClassNotFoundException引起,它不是';不要在本地抛出_Java_Amazon Web Services_Jar_Aws Lambda_Bazel - Fatal编程技术网

AWS Lambda,java抛出NoClassDefFoundError,由ClassNotFoundException引起,它不是';不要在本地抛出

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

我最近开始使用AWS Lambda和Java

一直都很顺利,直到我开始用匕首2注射

现在Lambda抛出以下错误:

{
  "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
  """
)