1

我正在尝试使用 Micronaut、GraalVM 和 Docker 在 Java 中创建和部署 AWS Lambda 函数。我正在按照本教程使用 GraalVM 运行时创建 AWS lambda。

我已经使用micronautcommand创建了 java 项目$ mn create-app my-app --features aws-api-gateway-graal。然后在不更改代码或配置文件的情况下,尝试使用 GraalVM 原生镜像构建 Docker 镜像。在构建 graalvm 本机映像时的 docker build 步骤中,我收到以下警告:

警告:中止独立映像构建。在映像运行时 com.amazonaws.serverless.proxy.model.ContainerConfig 初始化或重新初始化的类的映像堆中不允许有任何实例。尝试使用 --initialize-at-build-time=com.amazonaws.serverless.proxy.model.ContainerConfig 将此类标记为构建时初始化

Detailed message:
Trace:     field io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler.config

警告:使用 -H:+ReportExceptionStackTraces 打印底层异常的堆栈跟踪*

警告:图像“服务器”是一个后备图像,需要 JDK 才能执行(使用 --no-fallback 来抑制后备图像生成)。

构建后,我将带有引导文件的 docker 映像导出到 function.zip 文件,因为它是在教程中编写的。然后我将 function.zip 文件上传到我创建的 AWS lambda 函数,当我尝试测试函数时,我得到了这个错误:

{  "errorType": "Runtime.ExitError",
   "errorMessage": "RequestId: 888854d7-0e0e-42b4-a138-9a003c3455e1 Error: Runtime exited with error:
    exit status 1"
}

START RequestId:888854d7-0e0e-42b4-a138-9a003c3455e1 版本:$LATEST
错误:没有 bin/java 并且没有环境变量 JAVA_HOME
END RequestId:888854d7-0e0e-42b4-a138-9a003c3455e1
REPORT RequestId:888854d7-0e0e-428 9a003c3455e1 持续时间:415.09 毫秒计费持续时间:500 毫秒内存大小:128 MB 使用的最大内存:16 MB
RequestId:888854d7-0e0e-42b4-a138-9a003c3455e1 错误:运行时退出错误:退出状态 1
Runtime.ExitError

我不知道出了什么问题。我还没有找到任何解决这个问题的方法。

4

1 回答 1

0

此类调用该类的静态defaultConfig方法ContainerConfig

io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler
com.amazonaws.serverless.proxy.internal.LambdaContainerHandler

为了解决这个问题,我们需要在运行时而不是编译时初始化这些类。

我对 GraalVM 完全陌生,现在无法解释这是什么原因。

我的native-image配置。

native-image 
--delay-class-initialization-to-runtime=io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler,com.amazonaws.serverless.proxy.internal.LambdaContainerHandler
--no-fallback
--no-server 
-cp build/libs/yourJarName.jar

资源: https ://medium.com/graalvm/understanding-class-initialization-in-graalvm-native-image-generation-d765b7e4d6ed

于 2019-07-08T09:46:00.340 回答