JavaFx11+构建打包(含可执行文件),以及获取资源文件路径问题详解
创始人
2025-05-29 16:53:07
0

前言

关于Fx如何打包的问题,相信是每个Fx新手都非常关心的。
但是在Fx的打包中存在不少的坑,并且由于国内关于fx的资料稀少,自从Fx被移除jdk之后,很多的资料还停留在jdk8,与javaFx11+ 的打包方式完全不一致,有些反而起到了误导作用。这也导致Fx打包的门槛进一步提高。
因此我来简单的聊一聊如何快速构建javaFx 11+的程序(同样适用于17+)。

构建Jar

对于java应用程序来说,第一步永远是构建jar包。
构建jar包的方式不难,我在此提供两种思路。

  1. 利用idea的配置来构建jar包。
    只需要在项目里面添加Atifact(按提示设定主类之类的,然后构建项目),你就会发现你的输出文件夹多了一个jar包,因为非常简单,且idea自带提示,因此不多作介绍。

  2. 利用maven插件来构建jar包

不要认为用插件是不好的,实际上我反而推荐这种方式来构建jar。因为对于maven项目来说,管理起来更加方便,也更容易实现。

下面来说说怎么用maven插件打包。

添加插件

首先,我们在maven的pom.xml里面添加插件声明。

 maven-assembly-pluginfalsejar-with-dependenciescom.modu.Appmake-assemblypackageassembly

这里assembly可能会报红(在idea中),我不知道为什么会这样,但是实际上它压根不影响打包,别管它就行。

添加插件的目的,是让插件替我们打包依赖,如果我们不用插件,maven默认的打包不会打包依赖,也就无法运行。

然后我们可以执行打包了:
打包
选择package,然后静静等待打包完成,你会发现输出文件夹多了你想要的jar包。
打完包之后,一定要记得运行一次,如果jar包不能运行或者报错,要思考是哪一步出现了问题或者程序里有什么bug。

打包可执行文件

构建好jar包之后,虽然我们可以运行程序了,但是我们不可能让用户去运行一个jar包,因为不能保证他们的电脑上都安装了java的运行环境。
这种时候不可避免地要用到一些打包软件来帮助我们构建exe启动器(安装器),对于javaFx,我比较推荐的是TimiExe4Fx这款软件。

简单介绍,这是一款国人开发的Fx打包软件,虽然可能有一些小缺陷,但是对新人来说非常友好,很容易使用,并且作者夜雨也在b战发布了对应的视频教程,有兴趣可以去学习观看,下面给出链接,不作赘述。
https://www.bilibili.com/video/BV1zG411s7GD/?spm_id_from=333.999.0.0&vd_source=5cb6867053eb693f0b8d3cb14ce88429

资源文件路径问题

众所周知,我们通常会使用如下代码来获取程序中的资源文件路径:

URL styleResource = this.getClass().getClassLoader().getResource("./css/baseControls.css");

我们都知道它会从classes目录下查找资源文件,但是我们在Fx中使用这串代码的时候要特别注意。
看上去它一切正常,程序运行起来也能完美的找到文件。
然而……
一旦你打包之后再次运行程序,你就会发现它出问题了。
比如我遇到的一个问题,我想加载这个css文件,但是因为路径而失败了。
我这里遇到的问题如下:
运行出错
分析错误原因,还是路径的锅,虽然不知道具体路径最后被解析成了什么样,但是猜测应该是:

!/./css/baseControls.css

因此当我们把前面的./去掉之后,我们就会发现一切正常了。
这个问题虽然不难,但却是个隐藏的坑,即有时候程序没打包时运行起来正常,打包之后却可能出错。

总结

最后,学到这里,你已经基本掌握了Fx程序的基本打包方法,可以尝试去构建你自己的应用程序了。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...