GraalVM将JavaFX程序编译成windows下直接执行的exe

Java这些年一直作为一种后端语言在各大中小常流行,不能说最好,但说国内最流行的后端语言应该不为过。所以很多人都忘记了Java其实也可以承担客户端的工作。

早些年1.4,1.5版本的时候,Java尚且还有个swing/jwt包支持做一些丑丑的UI程序,不过极其难用导致java版的客户端开发没有推广起来,即便后面多了一个jface,效果似乎也没好到哪里去,这种情况一直持续到jdk1.8里的JavaFX出来后。

不过困扰很多人的一个问题是,JavaFX写出来的好看的程序如何打包发布呢?最基础的做法当然是打成jar包,然后客户端安装jre后,jar就变成了一种“伪可执行程序”。但很多普通用户根本不知道jdk或者jre是何物,有没有办法可以直接打包成exe呢?

有,exe4j出现后,一定程度解决了这个问题,但是exe4j仍然有个问题,它没法将jre直接打进exe里,必须要通过'外链'的方式,比如把jre放在exe同级目录下,再压缩包分发出去。

那么究竟有没有一个办法可以直接打出完整的带jvm的exe呢?有的,就是今天介绍的GraalVM。


1: GraalVM介绍

官网:https://www.graalvm.org/
graalvm是一个支持将各类语言(Java,groovy,python,Ruby,R)语言编译成操作系统能直接执行的字节码程序的一个虚拟机。

GraalVM让Java再次变得强大,使用native-image把程序编译为目标平台的可执行文件,脱离jvm直接运行,启动速度飞快,内存负载也很低。

贴几个跟graalvm有关的网址

graalvm的github仓库:https://github.com/oracle/graal
graalvm的release版本下载:https://github.com/graalvm/graalvm-ce-builds/releases
JavaFX程序的demo:https://github.com/gluonhq/gluon-samples/
一个国人写的graalvm最佳实践:https://gitee.com/westinyang/java-graalvm-start


2: 准备环境

当前案例需要的环境如下

操作系统:Windows 10 64-bit(我用的是win10家庭版,版本号:21H1)
我用的是mac上安装的虚拟机,cpu型号:Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz 2.71 GHz

软件环境如下
1: graalvm (我用的是当前最新的社区版21.3.0)
2: visual studio(我用的是当前最新版本:2022)
3: Graalvm社区版
4: JavaFX的demo


3: 安装graalvm

Graalvm有2种版本,一是oracle维护的企业版,二是github社区维护的社区版。我们选择社区版来测试。
我们从github上下载社区版,下载地址:
https://github.com/graalvm/graalvm-ce-builds/releases
可以看到graalvm21目前支持两个java版本,11和17。我用的是java11
需要下载的有两个东西
1: graalvm的虚拟机
https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-21.3.0/graalvm-ce-java11-windows-amd64-21.3.0.zip
2: graalvm的Native-image工具
https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-21.3.0/native-image-installable-svm-java11-windows-amd64-21.3.0.jar

graalvm虚拟机选择版本下载
native-image选择版本下载

我们把他下载到c:/graalvm目录下,然后开始进行配置
第一步:配置虚拟机
解压缩graalvm虚拟机
graalvm你可以把他理解成就是一个java虚拟机,只是带了编译字节码的功能,因此配置它就跟配置普通jvm一样。
1: 设置JAVA_HOME,GRAALVM_HOME和PATH

JAVA_HOME:C:\graalvm\graalvm-ce-java11-21.3.0
GRAALVM_HOME: %JAVA_HOME%
PATH:%PATH%;%GRAALVM_HOME%\BIN
环境变量设置

2: 安装native-image工具

gu -L install c:\graalvm\native-image-installable-svm-java11-windows-amd64-21.3.0.jar

注意第一步里必须配置path里包含graalvm的bin目录,否则会提示gu不是一个可执行的程序,如果提示如图所示则表示安装成功


native-image安装成功

注意事项

  • native-image的版本必须跟graalvm虚拟机的版本对应,否则会报错

4: 安装visual studio c++

由于编译本地程序时需要借助于vsc++中的一些组件,因此强烈建议先安装vsc++
下载地址:
https://visualstudio.microsoft.com/zh-hans/
选择社区版:

Community 2022

安装的注意事项

  • 工作负载请选择:使用C ++桌面开发;
  • 语言包请选择:英语。
  • 路径请使用默认的。
    安装完后测试是否安装成功
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
vsc++安装成功

不同的vs版本可能路径不一样,要注意版本路径。

5: 编译打包exe。

我们可以使用官方提供的demo代码进行测试打包。
下载地址:
https://github.com/gluonhq/gluon-samples/
下载命令

git clone https://github.com/gluonhq/gluon-samples.git

然后进入github项目页,可以看到有很多子项目,我们进入到HelloFX的目录下
可以看到说明:
https://github.com/gluonhq/gluon-samples/tree/master/HelloFX

打包成本地可执行程序命令

那么接下来就很简单了

cd 代码目录
cd HelloFX
mvn gluonfx:build

可以看到


exe编译过程1

exe编译过程2

编译完成后,最后在HelloFX\target\gluonfx\x86_64-windows目录下可以看到有一个HelloFX.exe的可执行程序,包大小约为58m。


HelloFX.exe

至此大功告成。
该包可以直接分享到任何windows10的64位机器上运行。

6: 写在最后。

利用graalvm打包windows的exe程序就写到这里,接下来我会研究一下如何打mac上的包。

你可能感兴趣的:(GraalVM将JavaFX程序编译成windows下直接执行的exe)