【问题标题】:Quarkus GraalVM native build fails in AWS Lambda with ClassNotFoundExceptionQuarkus GraalVM 本机构建在 AWS Lambda 中失败并出现 ClassNotFoundException
【发布时间】:2022-06-14 04:12:46
【问题描述】:

我想使用 quarkus 创建一个 java 项目,并希望使用 GraalVm 进行提前编译以减少 AWS lambda 中的冷启动时间。

当我在 AWS Lambda 中部署它并运行测试时,我收到以下错误:

Class not found: de.timguy.lambda.GreetingLambda: java.lang.ClassNotFoundException
    java.lang.ClassNotFoundException: de.timguy.lambda.GreetingLambda. Current classpath: file:/var/task/

我采取的步骤

Version info: GraalVM 22.0.0.2 Java 11 CE
 3 user-provided feature(s)
  - io.quarkus.runner.AutoFeature
  - io.quarkus.runtime.graal.DisableLoggingAutoFeature
  - io.quarkus.runtime.graal.ResourcesFeature    
Produced artifacts:
 /project/quark2-1.0.0-SNAPSHOT-runner (executable)
 /project/quark2-1.0.0-SNAPSHOT-runner.build_artifacts.txt

Finished generating 'quark2-1.0.0-SNAPSHOT-runner' in 11m 54s.

BUILD SUCCESSFUL in 12m 52s
  • AWS - 创建函数“quark2”
    • 运行时“Java 11 Coretto”
    • 编辑运行时设置:Handler = de.timguy.lambda.GreetingLambda
    • 通过 S3 上传 quark2/build/runner.zip
    • 测试 -> ClassNotFoundException(见顶部的完整错误)

【问题讨论】:

    标签: java aws-lambda graalvm-native-image quarkus-native


    【解决方案1】:

    我选择了错误的运行时设置:

    • Lambda -> 代码 -> 运行时设置 -> “Amazon Linux 2 上的自定义运行时”或“自定义运行时”而不是 Java11

    (仍然好奇:

    • 2 个不同的自定义运行时,因为它们都可以工作。 Documentation 帮不了我
    • GraalVM / Quarkus 如何知道我的目标环境以进行提前编译?
      • 是的,命令行告诉“native”,但是要获取哪个 docker 映像来构建这些东西? )

    【讨论】:

      【解决方案2】:

      Quarkus 在以 AWS Lambda 为目标时会生成一个特殊的 zip 文件。如果你打开它,你会看到一个引导文件。引导文件仅用于自定义运行时。自定义运行时知道在启动时执行该操作。

      如果您错误地将本机可执行文件部署到 Java 管理的运行时,那么 JVM 将无法找到您的处理程序方法,因为它不是类路径上的类,而是本机可执行文件。

      Quarkus 知道如何以这种方式打包您的 Lambda 函数,因为您使用了 amazon-lambda 扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        • 2020-04-19
        • 1970-01-01
        • 2023-03-05
        • 2020-01-17
        • 2015-03-13
        • 1970-01-01
        相关资源
        最近更新 更多