[最佳实践] 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)
步骤
- 打包成jar包运行
- 打包成依赖graalvm的二进制文件
- 打包成不依赖grallvm的二进制文件
1. 打包普通jar包
官方教程:
shell script ./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:
```shell script
./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,但代码已经做了静态编译处理,所以执行效率有大幅提升,比较适合容器化启动。
- 安装vs c++依赖
下载Visual Studio Installer
需要取消中文并选择英文
打包命令(实际可能会报错)
./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的思路差不多吧,只不过实现的更为巧妙,更加轻量化。