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

1 概述

IDEA2020.1的文档中提到只有JFX8的工程才支持打成jar包,并且,如果直接使用Build Artifacts的话,会如下提示:

IDEA文档有提到这个的解决办法,是使用一些第三方工具。里面介绍了通过IDEA结合自身/Maven/Gradle打包发布JFX11以上版本的方法。但是,不足的地方有:

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

因此,本文结合这两者的优点,参照Maven的目录管理,以JFX工程为基础,记录了从新建工程到发布跨平台JFX应用的过程。

2 环境

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

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

3 新建JFX工程

这里的项目名为TestJFX,对应修改即可。

4 添加JFX11 SDK

添加上一步下载的对应平台的JFX SDK。

5 添加module-info.java

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

module TestJFX {
  requires javafx.fxml;
  requires javafx.controls;

  opens sample to javafx.fxml;
  exports sample;
}

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

6 添加VM Options

添加

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

其中

/usr/local/jfx/lib

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

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 外部依赖

由于没有了Maven管理依赖,所以外部依赖的管理会相对麻烦一点,基本上是以jar包的形式手动添加,这里以添加Gson为例,戳这里下载jar包,然后在项目目录下新建一个lib文件夹,把jar包放进去:

接着在项目结构中把整个lib文件夹添加到外部库:

然后VM Options中添加lib路径,在上面的VM Options后面加一个冒号和lib就行:

但是,此时可以IDEA还不能进行补全,最后需要修改module-info.java:

加一行requires,此时IDEA能够进行补全了,每个jar包都不同,对应修改即可。

10 制作跨平台镜像

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

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

其中

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/{MAC_JMOD}:out/production:lib --add-modules TestJFX --output mac
mac/bin/java -m TestJFX/sample.Main

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

jlink --module-path "xxxxx/{WIN_JMOD};out/production" --add-modules TestJFX --output win
win\bin\java -m TestJFX/sample.Main

下面是Win下的截图:

11 demo

github

12 参考

Getting Started with JavaFX

到此这篇关于详解JFX11+IDEA跨平台打包发布的完美解决办法的文章就介绍到这了,更多相关JFX11+IDEA跨平台打包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在idea打包并上传到云服务项目流程分析

    一.首先 得先在idea打包好. 我使用的是springboot框架的项目 1.先开启自己的项目 在idea的最右侧有个这个边框,点击Maven 如果之前有该项目的打包,可以点击clean去清理之前的缓存,然后点击package进行打包项目 二.打包好了之后我们就需要自己的云服务器了 可以使用SecureCRT或者XShell插件操纵我们的阿里云服务器. 这里我使用的是XShell, 在此之前 ,我们需要云服务的环境搭配好的前提下,java jdk的环境,mysql数据库的搭建,还有tomcat

  • 浅析SpringBoot打包上传到docker并实现多实例部署(IDEA版)

    最近有一个朋友问我有没有玩过docker,回答起来底气不是很足 ^ - ^ (刚开始玩cloud的时候接触过,玩过一会,后面在实际开发中比较少用,所以基本上可以说是忘记了.),今天花了点时间整理之前的笔记以及整理走一个流程,记录一下吧,下次玩得时候C V 就好啦~ 1. Docker的安装以及开启远程访问 1.1 安装 # 检查虚拟机内核版本,必须是3.10及以上 uname -r # 安装docker yum install docker # 输入y确认安装 # 启动docker system

  • idea 打包的jar运行报 "XXX中没有主清单属性"

    使用idea2018打包了一个spring boot项目(打包为jar) 启动是报错如下: 错误原因 打包后的jar文件中的MANIFEST.MF缺少项目启动项,即没有Main-Class和Start-Class 如下: 解决方案如下 1.指定MANIFEST.MF路径 项目打包前 第一步 file–>project structure 弹框后选中Atifacts-> + ---->jar---->from module with dependenceis 第二步 选择一个Main

  • idea打包成war包部署到tomcat及访问路径问题(图文详解)

    idea将web项目打包成war最重要的是配置atrificats. 首先打开file -> project structure 创建之后,output directory即为输出war包的路径.Name可以随意,之后点击绿色+,打开directory content 选择webapp目录,记得勾选include in project build 点击ok后,新建一个配置 选择artificats 这样就算配置完成,点击run执行之后,就到前面的output directory设置的文件夹里找到

  • 详解idea打包jar的多种方式

    这里总结出用IDEA打包jar包的多种方式,以后的项目打包Jar包可以参考如下形式: 用IDEA自带的打包形式 用Maven插件maven-shade-plugin打包 用Maven插件maven-assembly-plugin打包 用IDEA自带的打包方式: 打开IDEA的file -> Project Structure,进入项目配置页面.如下图: 点击Artifacts,进入Artifacts配置页面,点击 + ,选择如下图的选项. 进入Create JAR from Modules页面,

  • 如何用Intellij idea2020打包jar的方法步骤

    这篇博客,由图片构成,方便我自己记住如何打包,最后一张图带上,如何引入第三方文件 1. 自己鼓捣一个工程,一路新建哈 2.在工程上右键,然后点击Open Moudle Setting 3. 选择 Artifacts 翻译成中文"史前古器物" 看来这个词来自考古学.意思是打包就变成古董了. 4. 顶部的条理,选择 build Artifacts 5. 成功的用Intellij 做成了一个jar 6. 如何引入第三方类包,进行开发 工程下新建一个文件夹 lib 将需要用的第三方类包拷贝进来

  • 将idea工程打包成jar文件的全步骤

    前言 近日在工作中遇到了一个问题,需要把本地的java文件打成jar包,传到云服务器上运行.于是学习了一下如何在intellijidea中将java工程打成jar包. 步骤如下: *File->PorjectStructure *在ProjectSetings中选择Artifects.点击+号选择jar文件中的Empty选项 *在Name选项中修改jar文件的名字.*然后点击下方的CreatManifest按钮,点击ok(应该默认是当前工程) * 点击Main Class右侧的文件夹图标,选择当

  • idea打包java程序(包含依赖的所有jar包)

    Intellij Idea打包Java项目 打开模块设置 如下图所示,选中需要打包的模块,右键点击,即会出现如下图所示的内容,点击Open Module Settings. 创建Artifacts 配置Jar包信息 注意配置输出路径 Output directory: 移动依赖Jar包到指定文件夹中并配置路径 如下图所示,将项目依赖的Mysql驱动包移动到library文件夹中.方法是只需要在上右键点击创建文件夹,然后将第三方的Jar包拖动进入此文件夹即可. 并且点击图中马赛克部分的那个Jar文

  • 浅谈IDEA2018打包可执行jar包的流程

    本人使用的是2018版的IDEA,发现与之前版本打包Jar包的流程略有些许差异 (如果想打包为不可执行的jar包,在打包过程中不要生成MANIFEST.MF文件即可) 一:项目结构 二:进入项目设置功能 三:点击"+"号,选择JAR,这里可以看到有两种选项 Empty:空的jar结构 From modules with dependencies:可以将项目中依赖的其他jar包或资源一并打入到我们要打包的jar包中,并且会帮我们做好项目文件的导入 两种不同的选择方式,在后面的页面选项会有

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

    1 概述 IDEA2020.1的文档中提到只有JFX8的工程才支持打成jar包,并且,如果直接使用Build Artifacts的话,会如下提示: IDEA文档有提到这个的解决办法,是使用一些第三方工具.里面介绍了通过IDEA结合自身/Maven/Gradle打包发布JFX11以上版本的方法.但是,不足的地方有: 直接创建JFX工程默认只有一个src目录,不像Maven工程还带有resources与test,给管理资源文件以及外部依赖造成了困难,getClass().getResource()会

  • 详解宝塔Linux面板FTP无法连接的解决办法

    如果使用的是阿里云服务器,需要在安全组设置中,对22.21端口放行,并且被动端口(39000 - 40000)也需要处于放行状态 宝塔Linux面板在使用sftp用最高权限连接时一切正常,但是使用在宝塔里面创建的ftp的账号密码,就无法登陆,相信大家遇到过这样的问题.遇到这样的问题,需要修改一些配置. 第一步:进入宝塔Linux面板中的软件管理,找到Pure-Ftpd 1.0.47点设置 第二步:点击配置修改:如图所示,查找"ForcePassiveIP"(位置188行左右),搜索:

  • 详解maven中央仓库连不上的解决办法

    方案一.使用国内的镜像阿里仓库等 首先通过maven的路径找到setting.xml的文件 然后在其中修改mirror和profile 保存一下就好了 方案二:https://maven.aliyun.com/mvn/search打开这个网站在里面下载你需要的jar包放到自己的本地仓库中 到此这篇关于详解maven中央仓库连不上的解决办法的文章就介绍到这了,更多相关maven中央仓库连不上内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • 详解关于Windows10 Java环境变量配置问题的解决办法

    关于Windows10 Java环境变量配置问题的解决办法 由于最近有一些时间,所以想要把之前学过一段时间的Java重新捡起来看看,之前的学习环境是Ubuntu,对于环境变量的配置和Windows也没有什么本质的区别,只不过是要用自带的编辑器更改一些东西而已. 那么我先讲讲我对于环境变量的一些自己的理解,由于每次编译源程序的时候需要用到编译工具,而Java的编译工具就是从oracle官网上下载的jdk包中的一些jar文件,所以如果要让系统识别java或者javac命令,那么就必须让系统知道这些文

  • 详解Nginx反向代理WebSocket响应403的解决办法

    在Nginx反向代理一个带有WebSocket功能的Spring Web程序(源代码地址 )时,发现访问WebSocket接口时总是出现403响应,Nginx的配置参考的是 官方文档 : http { // ssl 相关配置 ... map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 8020; location /ws { proxy_pass http://some-ip:8

  • 详解Docker无法正常启动的原因及解决办法

    一.Docker启动异常表现: 1.状态反复restaring,用命令查看 $docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 21c09be88c11 docker.xxxx.cn:5000/xxx-tes/xxx_tes:1.0.6 "/usr/local/tomcat..." 9 days ago Restarting (1) Less than a second ago xxx10 2.Dock

  • 详解@Vue/Cli 3 Invalid Host header 错误解决办法

    我的host设置 报错如下: 解决办法: @Vue/Cli 3 在vue.config.js里加上 .disableHostCheck(true) vue-cli 在webpack.dev.conf.js里加上 devServer: { disableHostCheck: true } 最后 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • 详解pycharm连接不上mysql数据库的解决办法

    问题描述 环境:ubuntu18.04,mysql5.7 今天在ubuntu下使用pycharm连接mysql,发现连接不上 这不是缺少驱动吗?下载之! 下好之后点进去 连接 点击test connection 这是什么鬼??? 网上找各种博客都说是权限问题,然而我试了之后发现并不是,授予root用户所有权限之后仍然连接不上,我突然想到可能是驱动版本的问题,目前mysql的最新版本是8.0,而驱动的版本也正好是8.0,这之间是不是有什么关联呢. 解决办法 点开驱动下载页 点击右边+号 依次选择-

  • 详解eclipse将项目打包成jar文件的两种方法及问题解决方法

    第一种:利用eclipse中自带的export功能 第一种方法分两种情况先来看第一种情况:没有引用外部jar的项目打包 步骤一:右键点击项目选择导出(export),选择java>jar文件(不是选择可运行jar文件) 步骤二:选择你要导出的项目以及文件,指定文件导出路径.连续点击两个下一步后到第四步. 步骤三:选择主类. 按照以上步骤即可完成对一个不引用外部jar项目的打包. 第二种情况:没有引用外部jar的项目打包 当我们引用了外部jar后,使用eclipse自带的export打包略显繁琐.

  • 详解Vue+elementUI build打包部署后字体图标丢失问题

    错误描述: Vue+elementUI  build打包部署后字体图标丢失,控制台显示文件element-icons.woff和element-icons.ttf文件404 错误展现: 控制台报错截图 dom渲染展示 解决方法: webpack module配置:(build目录下webpack.base.conf.js) module: { rules: [ ...(config.dev.useEslint ? [createLintingRule()] : []), { test: /\.(

随机推荐