• [最佳实践] 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包

    官方教程:
    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,但代码已经做了静态编译处理,所以执行效率有大幅提升,比较适合容器化启动。

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

    ./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的思路差不多吧,只不过实现的更为巧妙,更加轻量化。

  • 相关阅读:
    WCF中关于可靠会话的BUG!!
    控制并发访问的三道屏障: WCF限流(Throttling)体系探秘[下篇]
    《天使之恋》,一部重口味的纯美爱情电影
    一个关于解决序列化问题的编程技巧
    [转]Design Rules for ModelViewPresenter
    你知道Unity IoC Container是如何创建对象的吗?
    只在UnitTest和WebHost中的出现的关于LogicalCallContext的严重问题
    使命必达: 深入剖析WCF的可靠会话[原理揭秘篇](上)
    回调与并发: 通过实例剖析WCF基于ConcurrencyMode.Reentrant模式下的并发控制机制
    如何编写没有Try/Catch的程序
  • 原文地址:https://www.cnblogs.com/xiaojiluben/p/15994704.html
Copyright © 2020-2023  润新知