[最佳实践] quarkus编译二进制可执行文件

简介

本节将前两节的工程代码打包成window上可执行的二进制文件,拓展名为exe。这一节主要会有些坑,本节主要参考官方文档

环境

如果需要打包二进制文件,需要先安装graalvm。推荐使用chocolatey安装, 只需要一条命令choco install graalvm

graalvm 22.0

PS D:\Project\quarkus-demo001\target> java -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment GraalVM CE 22.0.0.2 (build 17.0.2+8-jvmci-22.0-b05)
OpenJDK 64-Bit Server VM GraalVM CE 22.0.0.2 (build 17.0.2+8-jvmci-22.0-b05, mixed mode, sharing)

步骤

  1. 打包成jar包运行
  2. 打包成依赖graalvm的二进制文件
  3. 打包成不依赖grallvm的二进制文件

1. 打包普通jar包

官方教程:

    ./mvnw package

It produces the quarkus-run.jar file in the target/quarkus-app/ directory. Be aware that it’s not an über-jar as
the dependencies are copied into the target/quarkus-app/lib/ directory.

The application is now runnable using java -jar target/quarkus-app/quarkus-run.jar.

If you want to build an über-jar, execute the following command:

    ./mvnw package -Dquarkus.package.type=uber-jar

翻译一下,其实就是执行命令./mvnw package就可以得到jar包target/quarkus-app/quarkus-run.jar,使用java -jar target/quarkus-app/quarkus-run.jar来运行jar包。这不是我们的重头戏,主要是打二进制包。

2. 打包成依赖graalvm的二进制文件

此方法打包的二进制文件仍需要依赖graalvm,但代码已经做了静态编译处理,所以执行效率有大幅提升,比较适合容器化启动。

打包命令(实际可能会报错)

./mvnw package -Pnative

正确的打包命令
使用附加依赖的打包命令

cmd /c 'call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat" && mvn package -Pnative'
  • 执行上述命令或许会遇到一下错误
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.1.1.Final:build (default) on project quarkus-echo: Failed to build a runnable JAR: Failed to augment application classes: Build failure: Build failed due to errors
[ERROR]     [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Cannot find the `native-image` in the GRAALVM_HOME, JAVA_HOME and System PATH. Install it using `gu install native-image`

其实日志已经说出了解决方法,那就是执行命令安装native-image,在window平台上使用该命令安装

gu.cmd install native-image

打包过程似乎非常耗资源,需要耐心等待

  • 获得打包文件
    废了九牛二虎之力,终于得到了可执行文件,该文件在安装了graalvm的机器上就可以直接执行了
    可执行文件

3. 打包不需要依赖的二进制文件

第二种方法可以的话,这种方法其实很简单了,只需要更换打包命令即可。

cmd /c 'call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat" && mvn package -Pnative -Dquarkus.native.container-build=true'

同样可以得到可执行文件,这个文件的原理大概是把需要的graalvm精简api也一起打包进来了,跟jre的思路差不多吧,只不过实现的更为巧妙,更加轻量化。

posted @ 2022-03-11 17:41  小小记录本  阅读(826)  评论(0编辑  收藏  举报