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

1 概述

IDEA2020.1的文档中提到只有JFX8的工程才支持打成jar包,而且,若是直接使用Build Artifacts的话,会以下提示:
在这里插入图片描述
IDEA文档有提到这个的解决办法,是使用一些第三方工具。里面介绍了经过IDEA结合自身/Maven/Gradle打包发布JFX11以上版本的方法。可是,不足的地方有:css

  • 直接建立JFX工程默认只有一个src目录,不像Maven工程还带有resources与test,给管理资源文件形成了困难,getClass().getResource()会出现空指针问题,可是好处是打包出来的文件能带上JFX jmods跨平台直接运行,只需具有JDK环境
  • 直接建立Maven项目虽然是管理文件方便,依赖也很容易处理,可是不管是直接经过Maven打出的jar包仍是经过JavaFX Maven Plugins打出来的jar包默认绑定了开发平台的JFX SDK,简单地说就是Linux开发的JFX程序不能直接跑在具备JDK环境的Win上,由于用的是Linux的JFX SDK而不是Win的JFX SDK

所以,本文结合这二者的优势,参照Maven的目录管理,以JFX工程为基础,记录了重新建工程到发布跨平台JFX应用的过程。html

2 环境

  • IDEA 2020.1
  • OpenJDK 11
  • OpenJFX 11 Linux SDK
  • OpenJFX 11 Linux/Windows/Mac OS X jmods

JDK安装就不说了,JFX直接下载而后在工程中经过外部库引入便可,三种jmods解压出来便可,用于最后生成可执行文件时添加的模块。
下载连接戳这里java

3 新建JFX工程

在这里插入图片描述
这里的项目名为TestJFX,对应修改便可。
在这里插入图片描述linux

4 添加JFX11 SDK

在这里插入图片描述
添加上一步下载的对应平台的JFX SDK。
在这里插入图片描述git

5 添加module-info.java

在src目录右键New->module-info.java,修改以下:github

module TestJFX {
    requires javafx.fxml;
    requires javafx.controls;
    
    opens sample to javafx.fxml;
    exports sample;
}

其中TestJFX为新建项目时的项目名,这个建立module-info.java时就默认加上了,sample为默认包,对应修改。ruby

6 添加VM Options

在这里插入图片描述
在这里插入图片描述
添加bash

--module-path /usr/local/javafx11/lib:out/production

其中app

/usr/local/javafx11/lib

为下载的JFX JDK的lib目录,后面的out不须要更改,是默认的编译输出的目录。maven

7 运行

这时候应该能够Shift+F10或者点击绿色小三角运行了:
在这里插入图片描述
固然内容是空的,由于什么也没有加。

8 添加资源文件

默认的fxml是放在与Main类同一目录下的,getResource()也没有加路径直接写上文件名:
在这里插入图片描述
可是这是src文件夹,放个fxml还勉强能够接受,放张图片总不合适吧?因此,新建一个资源文件夹,把css,fxml什么的都放里面:
在这里插入图片描述
直接在IDEA中移动fxml文件,Main中的引用路径也自动更改,不得不说这个特性是真的好用,但遗憾的是,抛出了空指针异常。
所以采起绝对路径来进行读取文件,经过URL+System.getProperty()指定绝对路径:

@Override
public 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的获取也同理,只不过是须要转换为String。

9 制做跨平台镜像

运行没问题以后就能够制做运行时镜像发布了,终端进入项目根路径:

jlink --module-path /usr/local/javafx11/jmod/linux:out/production --add-modules TestJFX --output output
output/bin/java -m TestJFX/sample.Main

在这里插入图片描述
其中

/usr/local/javafx11/jmod/linux

为开发平台jmod的路径,out/production与上面的VM Options保持一致。

--add-modules

后面跟的是模块名,这是在生成module-info.java时指定的,为项目名。

--output

为输出目录。
后一条命令中-m指定模块名,后面跟包名+主类名。
这样linux平台的镜像就制做好了,Mac与Win的同理,只须要把jmod换成对应平台的jmod便可,可是注意语法有一些差异,Mac的语法同Linux,只须要把jmod路径换一下,可是注意须要整个工程在对应的平台进行jlink:

jlink --module-path xxxxx/jfx/jmod/mac:out/production --add-modules TestJFX --output output
output/bin/java -m TestJFX/sample.Main

Win的语法有些区别,同样须要在Win下进行jlink:

jlink --module-path "xxxxx/jfx/jmod/win;out/production" --add-modules TestJFX --output output
output/bin/java -m TestJFX/sample.Main

下面是Win下的截图:
在这里插入图片描述

10 demo

11 参考

Getting Started with JavaFX

相关文章
相关标签/搜索