繁体   English   中英

Quarkus GraalVM 本机构建在 AWS Lambda 中失败并出现 ClassNotFoundException

[英]Quarkus GraalVM native build fails in AWS Lambda with ClassNotFoundException

我想用 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/

我采取的步骤

  • 创建项目: https ://code.quarkus.io/?g=de.timguy&a=quark2&b=GRADLE&e=io.quarkiverse.amazonalexa%3Aquarkus-amazon-alexa&e=amazon-lambda&extension-search=lambda

    • Quarkus 版本:2.8.2.Final (gradle.properties)
  • gradlew build -Dquarkus.package.type=native -Dquarkus.native.container-build=true

 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(见顶部的完整错误)

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

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

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

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

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

(仍然好奇:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM