Java9模块化(Jigsaw)结合javafx应用,创建零依赖桌面应用程序

Java9模块化(Jigsaw)结合javafx应用,创建零依赖桌面应用程序

首先说明编译环境: java11 + idea
java的桌面应用现在首选的肯定是javafx.在java8时,javafx与JDK结合,使得不需要额外下载SDK即可使用,但是java9后,JDK模块化,使得javafx从中分离,现在我们用模块化构建javafx应用时会出现很多的问题,这篇文章记录下我碰到这些问题的解决方式

1. gradle不支持java9的模块化
gradle是我们平时非常常用的项目构建工具
由于gradle本身并不支持模块化的一系列操作(至少我没发现),例如使用jlink生成零依赖的应用程序
但是可以创建一个任务用来完成这些操作,这都不是什么大问题

2. 添加module-info后无法获取resources资源
此问题发生主要的原因在于gradle默认的目录结构,java模块化以后并不会把resources目录当做模块化的一部分,由于gradle我不是很熟练,所以我抛弃了gradle,用idea创建一个普通的项目

Java9模块化(Jigsaw)结合javafx应用,创建零依赖桌面应用程序_第1张图片
从图中可以看出有两个模块,因为写javafx的模块需要资源文件(fxml css image等),所以我们在和module-info同目录下(模块根目录)新建resources文件夹
我们在gradle中获取资源是通过下面这条语句获取的资源

getClass.getClassLoader().getResource("***");// *** 表示资源路径

现在我们通过下面来获取,注意的一点是资源路径最左边的 / 不能省,它表示模块的根目录

getClass().getResource("/resources/***"); // *** 表示资源路径

3. 如何将项目变成一个模块化应用
Java9模块化(Jigsaw)结合javafx应用,创建零依赖桌面应用程序_第2张图片
我们使用idea带的命令行来操作,首先执行此命令前我们需要准备除了JDK自带的模块以外你使用到的模块:由于我们只使用了javafx的模块,模块文件是以jmod为后缀的文件获取途径很多,可以从官网下载 https://openjfx.io/ 在这里就不赘述了.
准备好后,我们就可以开始运行我们的命令了,打包成零依赖的应用的方法是使用JDK自带的jlink工具,基本语法如下:

jlink --module-path "模块目录" --add-modules "你的模块名" --launcher 模块名=模块名/主方法所在类路径 --output "输出目录" --strip-debug --compress 2

Java9模块化(Jigsaw)结合javafx应用,创建零依赖桌面应用程序_第3张图片
以这个目录来说,我们使用的命令是这样的:

jlink --module-path "out\production\CalculatorJigsaw;out\production\algorithm;lib\module" --add-modules "pers.ignatiusgl.calculator.gui" --launcher pers.ignatiusgl.calculator.gui=pers.ignatiusgl.calculator.gui/pers.ignatiusgl.calculator.gui.main.MainWindow --output "out/application" --strip-debug --compress 2

out\production\CalculatorJigsawout\production\algorithm 是我写的两个模块路径
lib\module 是javafx的模块路径
pers.ignatiusgl.calculator.gui 是主方法所在的模块的模块名
pers.ignatiusgl.calculator.gui.main.MainWindow 是主方法所在类的类路径
out/application 是输出目录

然后我们可以看见在输出目录中出现这样的一个目录
Java9模块化(Jigsaw)结合javafx应用,创建零依赖桌面应用程序_第4张图片
可以看到文件只有45.7MB,这样的大小还是普遍可接受的,比之前必须要附带100多MB的JDK要强很多.
我们通过bin目录下的模块名.bat 运行应用
Java9模块化(Jigsaw)结合javafx应用,创建零依赖桌面应用程序_第5张图片

项目GitHub:https://github.com/IgnatiusGL/CalculatorJigsaw
可以运行项目中的 jigsaw.bat 创建零依赖的java应用

以上就是模块化在使用中我碰到的一系列问题,文中有错误的地方欢迎指出

你可能感兴趣的:(Java)