我想用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映像被获取来构建这些东西?)