本文主要知识点: 1. 基于 jdk14 的 java 模块化, 2. jlink 的使用
前言
看过小刀最近朋友圈的小伙伴应该都知道, 最近小刀在写一个桌面的工具包, 可以连 k8s, 可以做图床等等, 其中用到的技术栈就是 jdk14+javaFX.
JDK14(Module)+javaFx
JDK14(Module)
选用 JDK14 , 主要是因为其中的 jpackage 命令, 这个命令可以帮我们把 java 程序打包成 win 中的 exe , 打包成 mac 中的 dmg, pkg . 这样使用者就不需要再单独安装 jdk/jre 了, 加上 java9 之后 java 的 module 化, 可以最大程度上的精简 jre, 虽然是精简了,但实际上,大家可以看到, 每次我在群里面发的包,还是接近 100MB 了.
javaFX
java 身为一个跨平台语言,我们对其更多直观的感受是在 win/mac 上写了一个 springboot 的程序, 然后丢到 win/linux 服务器上去运行. 不仅仅是服务端应用, 桌面端应用也可以这样跨平台. 用上面用 jpackage 打包之后的应用, 在不同的平台上打的包, 可以在不同的平台上运行. 虽然在 UI/字符显示上会有些许差别,但是差别不怎么大. 可以通过接口-不同平台实现类的方式进行处理.
系统配置要求
本文及后续文章系统要求:
jdk14(为了使用 jpackage 命令),
idea 社区版 2020.1 或以上(这个版本开始支持 jdk14),
gradle 6.3 及以上(gradle 6.3 开始支持 jdk14)
小刀的交流群(一个人踩坑? 踩的想砸电脑.....)
java Module
模块化和非模块化的区别,在代码的体现上就是 module-info.java 的区别
如上图所示: 该文件的关键在于三个关键字(requires, opens, export) , 因为我们这个项目已经是最上层模块, 不需要为别的模块提供方法, 所以没有用到 export 关键字.
requires: 我们这个模块(模块名: red.lixiang.tools.sunflower) 需要 javafx.controls 和 javafx.fxml 模块
opens: 主要是反射使用,javafx.fxml 可以反射 red.lixiang.tools.sunflower 中的类,然后可以对应实例化,或者调用实例中的方法
Jlink
在 java 模块化中, jlink 命令是核心,其作用就是把 jdk 中我们需要模块抽出来, 把我们自己引入的模块给打包一起,然后生成一个 image(可运行的镜像), 这个有 gradle 插件帮我们完成. 我们只需要知道这个命令作用即可,生成之后的文件如下:
我们可以在 lib 文件夹中看到 modules 这个文件, 就是合并之后的模块依赖, 这时候, 要运行这个程序,只需要运行 bin 目录下的 Sunflower/Sunflower.bat 就可以了.
jlink 的作用,我们可以用上图表示, 把项目的 requires 的打包到 lib 中的 modules 中, 把 jdk 中相关的命令打包到 image 文件夹中.
后语
大家对 jdk14, jlink , moudle 有什么想法? 欢迎一起讨论~~
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于