簡體   English   中英

Quarkus 原生鏡像構建失敗

[英]Quarkus Native Image Build Failure

我正在嘗試在 MacOS 上為 AWS Lambda function 構建本機映像。 該應用程序在 IDE 中編譯和運行得很好,但是當我嘗試構建本機映像時遇到以下問題:

 mvn clean install -Dnative -Dquarkus.native.container-build=true
 mvn clean install -Pnative -Dquarkus.native.container-build=true
  1. 在我的 pom.xml 文件中,構建失敗

    <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-amazon-lambda</artifactId> </dependency>

錯誤:4 種方法中不支持的功能詳細消息:錯誤:在圖像堆中檢測到 Random/SplittableRandom class 的實例。 在圖像生成期間創建的實例具有緩存的種子值,並且行為不符合預期。 要查看這個 object 是如何被實例化的,請使用 --trace-object-instantiation=java.util.Random。 object 可能是由 class 初始化程序創建的,並且可以從 static 字段訪問。 您可以使用選項 --initialize-at-run-time= 在映像運行時請求 class 初始化。 或者您可以編寫自己的初始化方法並從主入口點顯式調用它們。 Trace: Object was reached by reading field com.amazonaws.retry.PredefinedBackoffStrategies$EqualJitterBackoffStrategy.random of constant com.amazonaws.retry.PredefinedBackoffStrategies$EqualJitterBackoffStrategy@a7c6c06 reached by reading field com.amazonaws.retry.PredefinedBackoffStrategies$SDKDefaultBackoffStrategy.equalJitterBackoffStrategy of constant com .amazonaws.retry.PredefinedBackoffStrategies$SDKDefaultBackoffStrategy@6f61d2d9 通過掃描方法到達 com.amazonaws.retry.PredefinedRetryPolicies.getDefaultBackoffStrategy(PredefinedRetryPolicies.Z93F725A07423FE1C889F448B3)3D21F

  • 如果我將 pom 文件更改為以下

     <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-amazon-lambda-archetype</artifactId> <version>2.4.2.Final</version> </dependency>

構建成功且沒有錯誤,但例如 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=/庫/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
  • GRAALVM_HOME=/庫/Java/JavaVirtualMachines/graalvm-ce-java11-21.3.0/Contents/Home

即使啟用了調試功能,如何解決這個問題對我來說也沒有意義。

萊斯

默認情況下,Quarkus 在構建時初始化所有類。

這意味着如果您在代碼中使用 Random/SplittableRandom,這將在構建時初始化,因此會出現此錯誤。

如上所述,當您嘗試在 static 塊中初始化這些類時會出現此問題,例如:

public class RandomWrapper {

    public static final Random random;

    static {
        random = new Random();
    }
}

因您的錯誤而失敗。 但是,正如異常告訴您的那樣,您可以使用--initialize-at-run-time=<class-name>標志指定應在運行時初始化哪些類。 在 Quarkus 中,這可以通過在application.properties中指定以下配置來完成:

quarkus.native.additional-build-args=--initialize-at-run-time=org.acme.RandomWrapper

可以將這部分作為構建的一部分。 我個人更喜歡 yaml 屬性,所以首先要添加到 pom 中的是能夠使用 yaml 屬性:

        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-config-yaml</artifactId>
        </dependency>

然后在您的application.yaml中的src/main/resources添加您需要的命令行選項,例如

quarkus:
  banner:
    enabled: false

  native:
    additional-build-args:
      - --initialize-at-run-time=io.grpc.netty.shaded.io.netty.util.internal.logging.Log4JLogger,io.netty.util.internal.logging.Log4JLogger
      - --allow-incomplete-classpath

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM