JFX11+IDEA跨平台打包发布的完美解决办法

1 概述
IDEA 2020.1的文档中提到只有JFX8的工程才支持打成JAR包,并且,如果直接使用Build 的话,会如下提示:
IDEA文档有提到这个的解决办法,是使用一些第三方工具 。里面介绍了通过IDEA结合自身/Maven/打包发布JFX11以上版本的方法 。但是,不足的地方有:
因此,本文结合这两者的优点,参照Maven的目录管理,以JFX工程为基础,记录了从新建工程到发布跨平台JFX应用的过程 。
2 环境
JDK安装就不说了,JFX直接下载然后在工程中通过外部库引入即可,三种jmods解压出来即可,用于最后生成可执行文件时添加的模块 。
3 新建JFX工程
这里的项目名为,对应修改即可 。
4 添加JFX11 SDK
添加上一步下载的对应平台的JFX SDK 。
5 添加-info.java
在src目录右键New->-info.java,修改如下:
module TestJFX {requires javafx.fxml;requires javafx.controls;opens sample to javafx.fxml;exports sample;}
其中为新建项目时的项目名,这个创建-info.java时就默认加上了,为默认包,对应修改 。
6 添加VM
添加
--module-path /usr/local/jfx/lib:out/production
其中
/usr/local/jfx/lib
为下载的JFX JDK的lib目录,后面的out不需要更改,是默认的编译输出的目录 。
7 运行
这时候应该可以Shift+F10或者点击绿色小三角运行了:
当然内容是空的,因为什么也没有加 。
8 添加资源文件
默认的fxml是放在与Main类同一目录下的,()也没有加路径直接写上文件名:
但是这是src文件夹,放个fxml还勉强可以接受,放张图片总不合适吧?所以,新建一个资源文件夹,把css,fxml什么的都放里面:
直接在IDEA中移动fxml文件,Main中的引用路径也自动更改,不得不说这个特性是真的好用,但遗憾的是,抛出了空指针异常 。
因此采取绝对路径来进行读取文件,通过URL+.()指定绝对路径:
@Overridepublic void start(Stage primaryStage) throws Exception{String path = System.getProperty("user.dir");URL fxmlUrl = new URL("file:"+path+"/resources/fxml/sample.fxml");Parent root = FXMLLoader.load(fxmlUrl);primaryStage.setTitle("Hello World");Scene scene = new Scene(root);scene.getStylesheets().add(new URL("file:"+path+"/resources/css/1.css").toString());primaryStage.setScene(scene);primaryStage.show();}
其中
System.getProperty("user.dir")
获取项目路径,注意URL前面要加上file:,css的获取也同理,只不过是需要转换为 。
9 外部依赖
由于没有了Maven管理依赖,所以外部依赖的管理会相对麻烦一点,基本上是以JAR包的形式手动添加,这里以添加Gson为例,下载JAR包后,然后在项目目录下新建一个lib文件夹,把JAR包放进去:
接着在项目结构中把整个lib文件夹添加到外部库:
然后VM 中添加lib路径,在上面的VM 后面加一个冒号和lib就行:
但是,此时可以IDEA还不能进行补全,最后需要修改-info.java:
加一行,此时IDEA能够进行补全了,每个JAR包都不同,对应修改即可 。
10 制作跨平台镜像
运行没问题之后就可以制作运行时镜像发布了,终端进入项目根路径:
jlink --module-path jmod/linux:out/production:lib --add-modules TestJFX --output linuxlinux/bin/java -m TestJFX/sample.Main
其中
jmod/linux