[英]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
在我的 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 目錄的內容]
[測試環境]
即使啟用了調試功能,如何解決這個問題對我來說也沒有意義。
萊斯
這意味着如果您在代碼中使用 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.