1 背景

  Graalvm是Oracle推出的一款新型虚拟机,其中一个吸引人的功能是:它可以将Java代码编译成各个平台的本地代码,这些平台包括:linux、macOS、windows、iOS、android。

  这个功能可以极大地加快Java程序的启动速度,它对于docker+微服务(云原生)应用,以及客户端应用非常有用。

  2019年的时候我就有跟进过这个功能,并尝试在windows上编译Javafx,不过失败了。在查找了stackoverflow和github之后,发现它当时仅支持linux上编译Javafx,对wiindows的支持要到后续的版本。

  最近我又看到新的进展,发现Graavlm社区版从20.0.2(2020年8月)开始支持javaFx在windows本地编译。

  现在让我们再来尝试一下吧。

2 编译环境

  • Intel i7-4720HQ 16G
  • Windows 10 64-bit
  • VS2019社区
  • Graalvm社区版 20.0.2
  • JDK 11

3 步骤

3.1 安装graalvm

  Graalvm有2种版本,一是oracle维护的企业版,二是github社区维护的社区版。我们选择社区版来测试。

  首先到github上下载Graalvm社区版,可以看到有很多下载项:

  我们选择graalvm-ce-java11-windows-amd64-20.2.0.zip。下载完毕后,将它内容解压至:

C:\java\graalvm-ce-java11-20.2.0

  然后设置windows环境变量:

GRAALVM_HOME=C:\java\graalvm-ce-java11-20.2.0

JAVA_HOME=C:\java\graalvm-ce-java11-20.2.0

3.2 安装GRaalvm Native-image工具

  由于Native-Image工具与Graalvm是分开发行的,所以我们还要下载Native-Imag工具。下载地址为:

https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/native-image-installable-svm-java11-windows-amd64-20.2.0.jar

  下载完毕后,执行:

gu -L install native-image-installable-svm-java11-windows-amd64-20.2.0.jar

注意事项:

  • 必须安装这个工具,否则编译时会报错。
  • 工具的版本要跟Graalvm的版本匹配,否则会报错,类似于:

3.3 安装vs2019社区版

下载地址

https://visualstudio.microsoft.com/zh-hans/vs/

安装的注意事项

  • 工作负载请选择:使用C ++桌面开发;
  • 语言包请选择:英语。
  • 路径请使用默认的。
  • 详细的安装过程就不赘述了,请参考教程:《安装VS2019(C/C++)详细教程

测试

打开命令行,执行:

# 初始化x64的编译环境。
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\ Build\vcvars64.bat”

如果出现以下的输出,就说明编译环境是正常的:

3.4 示例代码

下载

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

说明:

  • 本示例由Gluon公司提供的,Gluon公司是OpenJFX项目和Graalvm项目的贡献者。
  • 示例中使用一个名为client-maven-plugin的插件,它封装了native-image的相关命令,简化了打包操作。
  • client-maven-plugin插件文档:https://docs.gluonhq.com/#_the_gluon_client_plugin_for_maven

3.5 编译

执行命令

# 进入示例目录

cd gluon-samples-master
# 进入HelloFx示例目录 cd HelloFX
# 初始化x64编译环境 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
# 编译。它相当于client:compile + client:link mvn clean client:build

输出:

  编译的时间有点长,请耐心等待。本机编译耗时230秒。

注意事项

  • 必须保证有足够的剩余内存,最好在5GB以上,否则有可能会报内存不足的错误。
  • 暂时关闭安全软件。安全软件会拖慢编译速度,生成的exe文件可能被误删。

4 效果

  进入 HelloFx/target/client/x86_64-windows目录,可以看到一个名为HelloFx.exe的文件。如下图所示:

4.1 启动速度

  双击HelloFx.exe执行,可以发现启动速度非常快,达到了秒开的程度。如下图所示:

4.2 程序大小

  可以看到,程序大小约为58MB。

  用7zip压缩后,仅为13MB,分发给用户非常方便。

  如果在链接时排除掉一些不用的内容,体积可以进一步减小。

5 局限和展望

  目前它仅支持windows 64-bit的编译,32-bit暂时不支持。不过随着版本的演进,未来可能会支持。

  如果近期就想要32-bit的,可以尝试下载Graalvm的源码,自己编译一个32-bit的版本。

6 参考资料

Windows下使用Graalvm将Javafx应用编译成exe的更多相关文章

  1. PyQt(Python+Qt)学习随笔:windows下使用pyinstaller将PyQt文件打包成exe可执行文件

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<windows下使用pyinstaller将多个目录的Pyt ...

  2. windows下使用pyinstaller把python文件打包成exe可执行文件

    使用pyinstaller打包有个好处就是所有依赖都打包进去了,可以随意把文件移动到别的电脑上使用 安装 pip install pyinstaller 新建一个demo.py文件 #!/usr/bi ...

  3. Windows下将Python源代码.py文件封装成exe可执行文件方法

    安装pyinstaller cmd中使用pip安装 pip install pyinstaller 同时会自动安装pywin32(pip真慢50M这里就走20KB),可以进行切换为国内源进行提速. 就 ...

  4. 用python写个简单的小程序,编译成exe跑在win10上

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  5. Windows下为 Eclipse 配置 C/C++ 编译环境(转)

    1.Eclipse及CDT的安装 CDT的全称是C/C++ DevelopmentTools,CDT使得Eclipse能够支持C/C++的开发.直接下载 eclipse CDT 集成版 下载地址:ht ...

  6. windows下使用mingw和msvc静态编译Qt5.15.xx

    windows下使用mingw和msvc静态编译Qt5.15.xx 下载并安装相关依赖软件 Python version 2.7 https://www.python.org/downloads/ ( ...

  7. 把perl脚本编译成exe

    来源:http://www.veryhuo.com/a/view/38338.html 今天想把 perl 脚本编译成 exe 以便脱离 perl 解释器独立运行.都可以生成PERL的PE文件,在PE ...

  8. 把java编译成exe和安装包

    由于某些项目甲方迟迟不结算尾款,这就很烦,只能想一些办法 我们知道java,python之类的代码是没有隐私可言的,那么怎么办,总要发给甲方验收,这就要做一些操作来确保自己的利益. 通过在源代码里加上 ...

  9. windows下安装python的C扩展编译环境(解决“Unable to find vcvarsall.bat”)

    个人文章除注明转载外,均为个人原创或者翻译. 个人文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本文链接:http://www.cnblogs.com/f ...

随机推荐

  1. B站自动爬取器并制作词云

    效果 词云展示 弹幕展示 爬取弹幕过程 基本步骤 1.寻找视频url 2.构造请求头 3.寻找弹幕地址 4.根据弹幕地址运用正则或xpath爬取 寻找B站视频的url 制作请求头 headers = ...

  2. 写了一个类似与豆瓣的电影的flask小demo

    先展示页面 基本的功能是都已经实现了,更多那个地方是可以点的.只不过视频上面还用的宏,哎呀,感觉麻烦.有多麻烦呢,需要先定义一个宏,然后进行引用.我们才能是用,以我的观点,还不如直接是一个循环完事.. ...

  3. Scrum 冲刺第四天

    一.每日站立式会议 1.会议内容 1)进行每日工作汇报 张博愉: 昨天已完成的工作:搜寻测试相关的资料 今日工作计划:编写测试计划 工作中遇到的困难:对测试接触得较少,有点头疼 张润柏: 昨天已完成的 ...

  4. do{}while(false)的用法

    do{}while(false): 在工作中我们能经常发现有人写 do{}while(false)  这样的代码,初看时让人迷惑不解,按照上面的语法 do{}while(false) 这样 do{} ...

  5. ORA-29701: unable to connect to Cluster Synchronization Service

    修改主机名后,has无法启动,将has启动之后,尝试ASMCA,出现如图提示: 再尝试登陆asm实例,出现日下提示: [oracle@edgzrip2-+ASM ~]$ sqlplus / as sy ...

  6. Linux下安装mysql-5.7.24

    Mysql数据库的安装对于开发者来说,是我们必然会面对的问题,它的安装过程其实并不复杂,并且网络上的安装教程也非常多,但是对于新手来说,各种不同形式的安装教程,又给新手们带来了要选择哪种方式进行安装的 ...

  7. Getting unknown property: common\models\Teacher::auth_Key

    找了一个半小时,不知道为什么会缺少这个属性,数据库里面的字段明明都是有的. 然后随后找到了原因,是因为key中的k大写了,所以无法识别这个属性.把自己坑到了,以此为戒,以后多注意细节问题

  8. MySQL高可用方案-MySQL InnoDB Cluster

    MySQL InnoDB Cluster简介 MySQL InnoDB Cluster 是最新GA的MySQL高可用方案,利用MySQL Group Replication和MySQL Shell.M ...

  9. LightningChart解决方案:XY和3D图表(Polymer Char GPC-IR&#174;-工程案例)

    LightningChart解决方案:XY和3D图表(Polymer Char GPC-IR-工程案例) 所在行业:石化公司成立时间:1992年LightningChart解决方案:XY和3D图表 P ...

  10. C#中RDLC合并两个列的值

    使用 & 符号连接 =Fields!ID.Value & Fields!Name.Value