JavaFX 打包示例(完结篇)
English | 中文
java21
使用Maven
,Gradle
和GraalVM
打包一个模块化的JavaFX项目。java21-non-modular
链接 使用Maven
打包一个非模块化的JavaFX项目。java22-win32
链接 一个利用Foreign Function and Memory (FFM) API
实现Windows全局键盘事件监听的JavaFX项目。
HelloWorld 链接
这个项目演示了如何完全使用PowerShell7
来编译一个Java项目并创建可执行的jar包和可运行exe文件,项目存在包结构并引入第三方依赖。
- Windows: 需要安装 WIX TOOLSET ,并将其bin目录添加到环境变量中
- macOS/Linux: 缺失的包一般可以根据提示通过包管理器直接安装
- 项目结构 SDK 选择 JDK21
- Gradle:Settings -> Build, Execution, Deployment -> Build Tools -> Gradle -> 指定 Gradle JVM 为项目 SDK
$env:xxx = "yyyy"
是设置一个临时环境变量,重启终端或者开启一些新的PowerShell标签页会失效
- 设置
JAVA_HOME
环境变量$env:JAVA_HOME = "C:\CommandLineTools\Java\jdk-21\"
-
使用
gradlew
或者mvn
的时候,只需要存在JAVA_HOME
这个环境变量就可以,不需要java
等命令配置在环境变量PATH中
-
- 设置
GRAALVM_HOME
环境变量$env:GRAALVM_HOME = "C:\CommandLineTools\Java\graalvm-jdk-21+35.1"
- 设置
JAVA_TOOL_OPTIONS
环境变量可以为gradle
设置代理$env:JAVA_TOOL_OPTIONS = "-DsocksProxyHost=localhost -DsocksProxyPort=7890"
- 若要进行
GraalVM
构建,需要使用Maven 3.8.8
构建可执行程序
.\gradlew.bat jpackageImage
构建安装包
.\gradlew.bat jpackage
请根据不同操作系统修改exec-maven-plugin
插件中有关下方两个命令的--icon
的参数值,Windows为
${project.basedir}/src/main/resources/application.ico
,macOS为${project.basedir}/src/main/resources/application.icns
,Linux为${project.basedir}/src/main/resources/application.png
运行(Maven plugin for JavaFX)
mvn javafx:run
构建出
.bat
形式的可执行程序(Maven plugin for JavaFX)
mvn javafx:jlink
构建可执行程序(手动拼接jpackage命令),
此命令构建出的结果其实与上面差别不大,但是是.exe的形式,并且图标已经设置好了
mvn clean
mvn package
mvn exec:exec@image
构建安装包(手动拼接jpackage命令)
mvn clean
mvn package
mvn exec:exec@installer
- 下载Oracle GraalVM
- 请运行在由
Visual Studio
提供的命令行环境中,Windows 终端
可以直接在标签页中打开Developer PowerShell for VS 2022
,其他用户可以在开始菜单的Visual Studio 2022
文件夹中找到 - 不关注
module-info.java
文件的存在与否
> $env:JAVA_HOME
C:\CommandLineTools\Java\graalvm-jdk-21.0.2+13.1\
> $env:GRAALVM_HOME
C:\CommandLineTools\Java\graalvm-jdk-21.0.2+13.1\
java 21.0.2 2024-01-16 LTS
Java(TM) SE Runtime Environment Oracle GraalVM 21.0.2+13.1 (build 21.0.2+13-LTS-jvmci-23.1-b30)
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 21.0.2+13.1 (build 21.0.2+13-LTS-jvmci-23.1-b30, mixed mode, sharing)
.\gradlew.bat nativeBuild
.\gradlew.bat nativeRun
Gluon下载JavaFX static libs
涉及到的相关源码FileOps.java
,因此可以通过配置java
的一些系统属性(需要梯子)来加速,在项目根目录下新建文件gradle.properties
内容如下,配置项的有关文档Java Networking and Proxies
,gradle相关文档Accessing the web through a proxy
org.gradle.jvmargs=-Dfile.encoding=UTF-8
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=7890
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=7890
重新执行相关命令,可能会因为之前的下载缓存导致重新执行命令失败,这时可以去删除此文件夹C:\Users\你的用户名\.gluon\substrate
再重新运行,JavaFX static libs
下载成功后可以注释掉相关代理配置以防其他平台梯子配置不同,如果不想改配置文件,也可以通过下述命令的方式来使用代理
gradlew.bat nativeBuild -D"https.proxyHost"=127.0.0.1 -D"https.proxyPort"=7890
mvn -Pwin gluonfx:build
mvn -Pwin gluonfx:run
mvn -Pmac gluonfx:build
mvn -Pmac gluonfx:run
mvn -Pwin gluonfx:build -D"https.proxyHost"=127.0.0.1 -D"https.proxyPort"=7890
mvn -Pmac gluonfx:build -D"https.proxyHost"=127.0.0.1 -D"https.proxyPort"=7890
添加了支持GraalVM的Logback作为日志框架,在你自己的项目,如果是第一次添加以及后续修改了Logback配置文件的时候,在执行GraalVM构建之前,先用
mvn -Pwin gluonfx:runagent
或.\gradlew.bat nativeRunAgent
来为native-image
生成一些必要的文件,它会自动保存到
src/main/resources/META-INF/native-image
,然后在执行GraalVM构建,否则生成的程序执行时不会生成日志文件,正常情况下,会在程序执行目录创建
logs
目录及日志文件
有时候mvn gluonfx:build
或者.\gradlew.bat jpackageImage
发生了错误后,执行.\gradlew.bat clean
提示文件被占用,这时候可以打开
任务管理器-性能-资源监视器-CPU
,在关联的句柄
处输入gluon
、jpackage
等关键词来检索出卡住的相关进程并干掉他
jpackage
默认使用WiX Toolset
来制作安装包文件,可以通过命令行参数修改WiX Toolset
相关配置文件,若不想使用jpackage
内置安装包的制作工具,也可以在构建出image后自行制作安装包