JavaFX桌面开发——打包成EXE供他人使用

1,459 阅读4分钟

前言

这篇文章的内容基于 整合了H2 的JavaFX 项目,详情可以看我之前的博客:JavaFX桌面开发——整合H2数据库这篇文章主要讲述了 如何在SpringBoot 已经整合了JavaFx的情况下配置 - 掘金 (juejin.cn)

JavaFX 作为一个桌面开发的工具,本身就是要形成 桌面应用,但是使用Java编写的桌面应用总是离不开Java环境这就很头疼了,而有没有什么方法,可以将整个项目变成EXE,这样就可以在Windows上运行了呢?

还真有,所以这篇文章将教会你:如何让你的JavaFX项目变成可以直接运行的EXE文件

前提条件

  • 项目中具备 Maven,且可以正常使用。
  • 具备转换工具(会讲)

转换工具

所谓的转换工具,就是让 JAR包变成EXE 的工具,较为常见的是 exe4j ,但是exe4j的缺陷非常明显:

安装麻烦,转换过程很长,内容不方便理解

特定情况下使用需要收费,且公司使用会吃律师函

这里推荐 使用 JDK14 中新增的指令 jpackage:(14以上的版本中也会带有这个指令)

使用方便,只需要一行指令就能完成全部的转换工作

转换效率高,通常不超过一分钟即可转换完成

如果没有 JDK14及以上版本的开发者,推荐前往下面的网站中下载JDK17一个性能表现非常优异的版本,具体细节略)

Java Download | Java 8, Java 11, Java 17, Java 21, Java 23 - OpenJDK Builds for Linux, Windows & macOS (bell-sw.com)


小声嘀咕:能使用到 SpringBoot 的开发者应该不可能出现没有 JDK 的问题叭。


具体操作

使用IDEA 打开项目后,先运行一遍,确保整个项目在IDEA的运行环境下没有问题

使用Maven 进行打包

右击项目的 pom.xml 文件,找到maven选项,依次执行 clean , package

正确完成clean后,整个项目不应该会有命名为 target 或者 classes 等的输出文件

正确完成package后,整个项目会重新出现输出目录,如下例:

image.png

到这里,我们需要 Maven 完成的事情就告一段落

使用 jpackage

在IDEA 中点击项目模块目录(对应上面我的例子中是 demo 目录),按下 Ctrl+Alt+F12 ,此时选择显示 项目模块目录

image.png

在弹出的文件资源管理器中进入刚才的模块目录,打开控制台。(可以通过清空上方的路径后输入cmd进行快捷弹出)

image.png

注意:这个目录不能随意选择,在打开cmd的目录中必须要有下面要讲的 --input 参数对应的目录不然这个项目将不能完成转换

在弹出的控制台中根据自己情况输入 jpackage 的相关参数:

参数作用示例说明
--type打包类型app-image可选:"app-image","exe", "msi",这里使用 app-image,选择另外两个选项需要安装 WiX
--name应用名称Aquacard打包后的名称,如“Aquacard.exe
--input输入目录targetjpackage读取的文件夹,需要为项目的输出目录
--main-jar应用的Jar包Aquacard.jar--input 目录中的 jar包
--win-console运行时启动控制台--win-console点开EXE后,打开一个控制台(和IDEA中运行的形式差不多),如果不添加该参数,即为后台运行,关闭时需要从任务管理器进行关闭
--dest输出目录dist输出到该目录,别和--input同一个目录,否则会循环复制

可以参考我的指令:

jpackage --type app-image --name Aquacard --input target --main-jar Aquacard.jar --win-console --dest dist

输入后回车,等待执行完成即可。

执行完成后,点开 输出目录(dist),找到里面的 exe,打开就可以成功运行了。

注意事项

  • 在文件结构不做更改的情况下打开 exe ,才能正常运行,否则一切白搭。即把输出目录(dist)开始的文件夹全部打包转发给其他人才能正常使用,单独的 EXE 启动不起来。可以通过创建快捷方式,让启动更快速

其他

修改Maven打包的Jar名

在使用 Maven 打包(package)的时候,生成的 jar 包总是类似于 项目名-0.0.1-SNAPSHOT.jar 格式的,这种文件名不光记起来麻烦,由于一些特殊字符的存在,有时候输入都是一个问题。

其实我们可以通过在pom.xml 中的 build 标签中添加 filename 标签来解决这个问题。如下图:

image.png


上图表示 将Maven 打包后生成的Jar包命名为 AquaCard.jar

Maven 修改内容

给出我的 在进行生成EXE时 pom.xml 需要做出的改动

<build>
    <finalName>AquaCard</finalName> <!--        打包后的文件名-->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

总结

这篇文章详细介绍了如何 将JavaFX项目变成EXE,使其脱离Java环境的限制