前言

关于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里面添加插件声明。

<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默认的打包不会打包依赖,也就无法运行。

然后我们可以执行打包了:

javafx导出jar不能运行 javafx打包成jar_java


选择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文件,但是因为路径而失败了。

我这里遇到的问题如下:

javafx导出jar不能运行 javafx打包成jar_javafx导出jar不能运行_02


分析错误原因,还是路径的锅,虽然不知道具体路径最后被解析成了什么样,但是猜测应该是:

!/./css/baseControls.css

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

总结

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