Quarkus构建native-image遇到的问题及解决

简介: 构建的时间比较长,构建完成后就会在 ./target 目录下生成一个二进制执行文件,一般名字是 quarkus-demo-1.0-runner,直接执行这个二进制文件就可以运行项目了。

网络异常,图片无法展示
|


本机构建 native-image


如果你本地安装了 Graal VM 的话,可以在项目目录下直接执行:

mvn clean package -Pnative

构建的时间比较长,构建完成后就会在 ./target 目录下生成一个二进制执行文件,一般名字是 quarkus-demo-1.0-runner,直接执行这个二进制文件就可以运行项目了。

➜  target: ./quarkus-demo-1.0-runner 
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2021-07-09 16:54:10,812 INFO  [io.quarkus] (main) quarkus-demo 1.0 native (powered by Quarkus 2.0.1.Final) started in 0.121s. Listening on: http://0.0.0.0:8080
2021-07-09 16:54:11,041 INFO  [io.quarkus] (main) Profile prod activated. 
2021-07-09 16:54:11,041 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy, smallrye-context-propagation]
^C2021-07-09 16:55:12,904 INFO  [io.quarkus] (Shutdown thread) quarkus-demo stopped in 0.008s

容器构建 native-image

如果你本地没有安装 Graal VM 的话,Quarkus 官方还提供了一个构建的基础镜像:quay.io/quarkus/ubi-quarkus-native-image,我们可以直接执行以下命令进行构建:

mvn clean package -Pnative -Dquarkus.native.container-build=true

容器构建遇到的问题

1. 构建时内存不足

在使用容器构建 native-image 的时候,可以会报如下错误:

[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:2.0.1.Final:build (default) on project quarkus-demo: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]         [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Failed to build native image
[ERROR]         at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:223)
[ERROR]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[ERROR]         at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:820)
[ERROR]         at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
[ERROR]         at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
[ERROR]         at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2442)
[ERROR]         at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1476)
[ERROR]         at java.base/java.lang.Thread.run(Thread.java:829)
[ERROR]         at org.jboss.threads.JBossThread.run(JBossThread.java:501)
[ERROR] Caused by: java.lang.RuntimeException: Image generation failed. Exit code was 137 which indicates an out of memory error. Consider increasing the Xmx value for native image generation by setting the "quarkus.native.native-image-xmx" property
[ERROR]         at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.imageGenerationFailed(NativeImageBuildStep.java:360)
[ERROR]         at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:200)
[ERROR]         ... 11 more
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

错误提示时内存不足,可以尝试设置 quarkus.native.native-image-xmx 参数,但是设置了这个参数还是报这个错。在查阅资料后,在一个 stackoverflow 的回答中看到了这样一句话:

Pay attention it has to be less than the memory you set in your docker daemon.

他说必须小于您在 docker 守护进程中设置的内存。

然后我查看 docker 的官方文档时发现,在 Mac 和 Windows 中默认的内存是 2GB。

所以只要调高这个值就可以了,推荐是 8GB,各系统设置方法:

Mac:docs.docker.com/docker-for-…

Windows:docs.docker.com/docker-for-…

2. 容器构建后的二进制文件无法运行

容器构建 native-image 完成后生成的二进制文件不能执行,提示 zsh: exec format error: ./quarkus-demo-1.0-runner

这是因为我本机是 Mac 系统,但是 Quarkus 提供的构建镜像是 Linux 系统,但是 Graal VM 目前好像并不支持交叉编译,所以在 Linux 系统里构建的二进制文件只能在 Linux 系统里执行。

所以我们可以直接用容器来运行这个构建好的二进制文件。

目录
相关文章
|
11月前
|
开发者
Flutter笔记:build方法、构建上下文BuildContext解析
本文主要介绍Flutter中的build方法和构建上下文对象。
328 2
Flutter笔记:build方法、构建上下文BuildContext解析
|
3月前
|
网络协议 JavaScript 前端开发
Java一分钟之-GraalVM Native Image:构建原生可执行文件
【6月更文挑战第13天】GraalVM Native Image是Java开发的创新技术,它将应用编译成独立的原生可执行文件,实现快速启动和低内存消耗,对微服务、桌面应用和嵌入式系统有重大影响。本文讨论了如何使用Native Image,包括常见挑战如反射与动态类加载、静态初始化问题和依赖冲突,并提供了解决方案和代码示例。通过合理规划和利用GraalVM工具,开发者可以克服这些问题,充分利用Native Image提升应用性能。
118 5
|
Android开发
【错误记录】Flutter 报错 ( Could not resolve io.flutter:flutter_embedding_debug:1.0.0. )(一)
【错误记录】Flutter 报错 ( Could not resolve io.flutter:flutter_embedding_debug:1.0.0. )(一)
1011 0
【错误记录】Flutter 报错 ( Could not resolve io.flutter:flutter_embedding_debug:1.0.0. )(一)
|
11月前
|
Java 应用服务中间件
CloudFoundry 环境上的 Java 应用开发如何指定 build pack
CloudFoundry 环境上的 Java 应用开发如何指定 build pack
|
11月前
|
Java 应用服务中间件 Apache
CloudFoundry 环境上的 Java 应用的 Application container
CloudFoundry 环境上的 Java 应用的 Application container
|
4月前
|
Java
Native Image部署和JVM部署的主要区别
Native Image部署和JVM部署的主要区别
|
存储 缓存 分布式计算
Gluten + Celeborn: 让 Native Spark 拥抱 Cloud Native
本篇文章介绍了 Gluten 项目的背景和目标,以及它如何解决基于 Apache Spark 的数据负载场景中的 CPU 计算瓶颈。此外,还详细介绍了 Gluten 与 Celeborn 的集成。Celeborn 采用了 Push Shuffle 的设计,通过远端存储、数据重组、内存缓存、多副本等设计,不仅进一步提升 Gluten Shuffle 的性能和稳定性,还使得 Gluten 拥有更好的弹性,从而更好的拥抱云原生。
2170 4
Gluten + Celeborn: 让 Native Spark 拥抱 Cloud Native
|
缓存 安全 算法
Core Image框架
解读官方文档中Core Image的能力与最佳使用
106 0
|
JSON 监控 算法
使用GraalVM Native Image将Java Swing应用Native化
Java Swing背景        Java Swing是从1.6时代开始成熟的Java桌面应用GUI框架,也是以前大学里做算法毕设时走Java栈码农的必备开发能力之一。虽然现如今Java的桌面端能力已有多种更优秀的替代方案,例如JavaFX、Eclipse RCP等,但作为经典GUI框架,Swing以其简单的编码模式、优秀的跨平台能力、JRE默认自带包以及较小的JAR分发包,一直是我的Jav
2166 0
|
缓存
【Flutter】Image 组件 ( cached_network_image 网络图片缓存插件 )(一)
【Flutter】Image 组件 ( cached_network_image 网络图片缓存插件 )(一)
742 0
【Flutter】Image 组件 ( cached_network_image 网络图片缓存插件 )(一)