JavaFx11+构建打包(含可执行文件),以及获取资源文件路径问题详解

前言

关于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-pluginartifactId>
                <configuration>
                    <appendAssemblyId>falseappendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependenciesdescriptorRef>
                    descriptorRefs>
                    <archive>
                        <manifest>
                            
                            <mainClass>com.modu.AppmainClass>
                        manifest>
                    archive>
                configuration>
                <executions>
                    <execution>
                        <id>make-assemblyid>
                        <phase>packagephase>
                        <goals>
                            <goal>assemblygoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>

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

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

然后我们可以执行打包了:
JavaFx11+构建打包(含可执行文件),以及获取资源文件路径问题详解_第1张图片
选择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文件,但是因为路径而失败了。
我这里遇到的问题如下:
JavaFx11+构建打包(含可执行文件),以及获取资源文件路径问题详解_第2张图片
分析错误原因,还是路径的锅,虽然不知道具体路径最后被解析成了什么样,但是猜测应该是:

!/./css/baseControls.css

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

总结

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

你可能感兴趣的:(java,gui,intellij-idea,java,maven,jar,idea)