java客户端_大家都是怎么发布Java客户端程序的?难道让用户自己装JRE?

JDK 9 以及更高版本的 JDK 以及拥有了一个叫做 jlink 的实用工具,能够将 JDK 和程序模块一起打包,做成一个小型的 jre。

对于一个简单的 hello world 程序,jlink 生成的 JRE(Linux x86_64,版本号为 11.0.5)大小只有41M,简单的用zip命令压缩一下就只剩16MB了,一般简单的命令行应用体积就在这个级别。Windows 上的小工具还可以考虑用 32 位的 JRE,最后生成的程序大小,以及占用的内存都还会小一截。

对于复杂一些的应用,可以参考一下我的ClassViewer/ClassViewer​github.com

这是一个 JavaFX 应用,依赖(包括间接依赖)的模块有java.base、java.datatransfer、java.xml、java.prefs、java.desktop、javafx.base、jdk.unsupported、javafx.graphics、javafx.controls和jdk.zipfs,经过 jlink 以及压缩后的效果是这样

作为9102年的 GUI 应用,这个体积完全合格,捆绑 JRE 发布还能避免用户 JRE 版本老旧(决定捆绑 JRE 后,ClassViewer v4 已经开始用 Java 13 开发了,并且做好了每次 Java 新版本发布都在第一时间迁移到最新版本的准备)或者是不支持 JavaFX,我觉得这是目前很理想的一种发布方式了。

如果你的项目使用 Gradle 作为构建工具,推荐用 badass jlink 插件来调用 jlink。

目前有大量库作为自动模块发布,而 jlink 要求依赖的模块拥有 module-info,不支持自动模块,badass jlink 插件在不需要对源码做任何修改解决了这个问题。插件会将所有自动模块内容全部解压合并到一个模块中,再为每个自动模块生成一个对应的空模块,在空模块中声明对合并模块的 requires transitive 依赖。

maven 我不太熟悉,虽然有一个 maven-jlink-plugin ,但是貌似不能解决自动模块的问题,依赖没有完成模块化的库可能会产生问题,可以通过手动实现 badass jlink 插件背后的工作来解决。

jlink 可以用 --launcher 选项为程序生成一个启动器,这个启动器在 Linux 上是 bash 脚本,在 windows 上是 batch 脚本。

对于一般的命令行应用,自动生成的脚本完全够用,不过对于 GUI 应用,特别是在 windows 上,默认脚本的效果就差强人意了:

可以看到,因为是 bat 脚本,所以启动后会产生一个终端,任务管理器里应用也会显示到 OpenJDK Platform binary 下,当然这不是jlink的问题,不过确实让人感觉到这不是原生应用。我写了一个 launcher 通过用 JNI 调用实现简单的启动器解决了这个问题,外表接近原生应用,连 java.exe/javaw.exe 都不再需要(使用 jlink 时添加 --strip-native-commands 选项就能避免包含这些命令):

启动器部分已经开源,可以轻松的定制构建自己的 launcher:Java GUI launcher - ClassViewer​github.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值