Quarkus GraalVM原生构建在AWS Lambda中失败,出现ClassNotFoundException.&



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

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

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。最后(gradle.properties)
  • gradlew build -Dquarkus.package。类型=本机-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";
    • runtime "Java 11 core ">
    • 编辑运行时设置:Handler = de.timguy.lambda.GreetingLambda
    • 通过S3上传quark2/build/runner.zip
  • 测试→ClassNotFoundException(见顶部的完整错误)

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

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

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

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

  • λ→代码→运行时设置->在Amazon Linux 2上自定义运行时或"自定义运行时";而不是Java11

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

相关内容

最新更新