Quarkus 原生镜像构建失败

Les*_*Les 3 java graalvm quarkus

我正在尝试在 MacOS 上为 AWS Lambda 函数构建本机映像。该应用程序在 IDE 中编译并运行得很好,但当我尝试本机映像构建时遇到以下问题:

 mvn clean install -Dnative -Dquarkus.native.container-build=true
 mvn clean install -Pnative -Dquarkus.native.container-build=true
Run Code Online (Sandbox Code Playgroud)
  1. 在我的 pom.xml 文件中使用以下内容,构建失败

    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-amazon-lambda</artifactId>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)

错误:4 种方法中不支持的功能详细消息:错误:在图像堆中检测到 Random/SplittableRandom 类的实例。在图像生成过程中创建的实例已缓存种子值,并且行为不符合预期。要查看该对象是如何实例化的,请使用 --trace-object-instantiation=java.util.Random。该对象可能是由类初始值设定项创建的,并且可以从静态字段访问。您可以使用选项 --initialize-at-run-time= 在图像运行时请求类初始化。或者您可以编写自己的初始化方法并从主入口点显式调用它们。跟踪:通过读取常量 com.amazonaws.retry.PredefinedBackoffStrategies$EqualJitterBackoffStrategy@a7c6c06 字段达到对象 com.amazonaws.retry.PredefinedBackoffStrategies$EqualJitterBackoffStrategy.random 通过读取常量 com 的字段 com.amazonaws.retry.PredefinedBackoffStrategies$SDKDefaultBackoffStrategy.equalJitterBackoffStrategy 达到对象通过扫描方法 com.amazonaws.retry.PredefaultBackoffStrategies$SDKDefaultBackoffStrategy@6f61d2d9 到达 .amazonaws.retry.PredefinedRetryPolicies.getDefaultBackoffStrategy(PredefinedRetryPolicies.java:110)

  • 如果我将 pom 文件更改为以下内容

     <dependency>
         <groupId>io.quarkus</groupId>
         <artifactId>quarkus-amazon-lambda-archetype</artifactId>
         <version>2.4.2.Final</version>
     </dependency>
    
    Run Code Online (Sandbox Code Playgroud)

构建成功且没有错误,但例如 function.zip 未在 /target 目录中创建。

[/target目录的内容]

  • com_abc_demo_xyz-1.0-SNAPSHOT-native-image-source-jar
  • com_abc_demo_xyz-1.0-SNAPSHOT-runner
  • com_abc_demo_xyz-1.0-SNAPSHOT.jar
  • 故障安全报告
  • 生成源
  • Maven 归档器
  • 行家状态
  • quarkus 应用程序
  • quarkus-artifact.properties

[测试环境]

  • Java 版本 11.0.6
  • Docker 桌面版 4.1.1
  • macOS 蒙特利
  • Maven 3.8.3
  • GraalVM:graalvm-ce-java11-21.3.0
  • JAVA_PATH=/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
  • GRAALVM_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-java11-21.3.0/Contents/Home

即使启用了调试功能,如何解决这个问题对我来说也没有意义。

莱斯

小智 6

默认情况下,Quarkus 在构建时初始化所有类。

这意味着,如果您在代码中使用 Random/SplittableRandom,这将在构建时初始化,从而出现此错误。

如上所述,当您尝试在静态块中初始化这些类时,就会出现此问题,例如:

public class RandomWrapper {

    public static final Random random;

    static {
        random = new Random();
    }
}
Run Code Online (Sandbox Code Playgroud)

由于您的错误而失败。但是,正如异常告诉您的那样,您可以使用--initialize-at-run-time=<class-name>标志指定应在运行时初始化哪些类。在 Quarkus 中,这可以通过在您的 中指定以下配置来完成application.properties

quarkus.native.additional-build-args=--initialize-at-run-time=org.acme.RandomWrapper
Run Code Online (Sandbox Code Playgroud)