前言
关于Fx如何打包的问题,相信是每个Fx新手都非常关心的。
但是在Fx的打包中存在不少的坑,并且由于国内关于fx的资料稀少,自从Fx被移除jdk之后,很多的资料还停留在jdk8,与javaFx11+ 的打包方式完全不一致,有些反而起到了误导作用。这也导致Fx打包的门槛进一步提高。
因此我来简单的聊一聊如何快速构建javaFx 11+的程序(同样适用于17+)。
构建Jar
对于java应用程序来说,第一步永远是构建jar包。
构建jar包的方式不难,我在此提供两种思路。
- 利用idea的配置来构建jar包。
只需要在项目里面添加Atifact(按提示设定主类之类的,然后构建项目),你就会发现你的输出文件夹多了一个jar包,因为非常简单,且idea自带提示,因此不多作介绍。 - 利用maven插件来构建jar包
不要认为用插件是不好的,实际上我反而推荐这种方式来构建jar。因为对于maven项目来说,管理起来更加方便,也更容易实现。
下面来说说怎么用maven插件打包。
添加插件
首先,我们在maven的pom.xml里面添加插件声明。
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- 此处指定main方法入口的class -->
<mainClass>com.modu.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
这里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程序的基本打包方法,可以尝试去构建你自己的应用程序了。