以下是通过批处理脚本结合jpackage工具实现JavaFX项目无依赖打包的完整方案,脚本将自动完成模块编译、运行时镜像生成和EXE打包流程:
无依赖打包批处理脚本(package.bat)
bat
复制
@echo off
setlocal enabledelayedexpansion
REM ========== 配置参数 ==========
set PROJECT_NAME=MyJavaFXApp
set MAIN_MODULE=hellofx/hellofx.Main # 格式: 模块名/主类全路径
set JAVA_FX_PATH=C:\javafx-sdk-17.0.2\lib # JavaFX SDK路径
set ICON_PATH=app.ico # 应用图标(可选)
REM ========== 编译模块 ==========
echo [Step 1] 编译JavaFX模块...
javac --module-path "%JAVA_FX_PATH%" --add-modules javafx.controls -d mods src*.java module-info.java
if errorlevel 1 (
echo [错误] 编译失败,请检查模块路径和代码!
exit /b 1
)
REM ========== 生成运行时镜像 ==========
echo [Step 2] 生成精简JRE...
jlink ^
--module-path "%JAVA_FX_PATH%;mods" ^
--add-modules hellofx,javafx.controls ^
--output custom-jre ^
--strip-debug ^
--compress 2
if errorlevel 1 (
echo [错误] JRE生成失败,检查模块依赖!
exit /b 1
)
REM ========== 使用jpackage打包EXE ==========
echo [Step 3] 生成无依赖EXE...
jpackage ^
--name %PROJECT_NAME% ^
--module %MAIN_MODULE% ^
--runtime-image custom-jre ^
--type app-image ^
--dest release ^
--icon "%ICON_PATH%" ^
--win-shortcut
if errorlevel 1 (
echo [错误] 打包失败,请检查jpackage参数!
exit /b 1
)
echo 成功生成EXE文件: release%PROJECT_NAME%\
pause
关键步骤说明
1. 配置参数
JAVA_FX_PATH:需替换为本地JavaFX SDK的lib目录路径MAIN_MODULE:需对应module-info.java中声明的模块名和主类路径
2. 模块化编译
- 通过
javac命令编译项目,需包含module-info.java文件声明依赖(如requires javafx.controls;) - 编译后的.class文件输出到
mods目录,确保模块路径包含JavaFX SDK
3. 生成精简JRE
- 使用
jlink从模块中提取最小运行时,仅包含javafx.controls等必要模块 --strip-debug和--compress 2参数可减少运行时体积约40%
4. 打包无依赖EXE
--type app-image生成可直接运行的文件夹(包含EXE和JRE)--runtime-image指向自定义JRE目录,实现无外部依赖- 最终EXE文件位于
release\项目名称目录中,可直接分发
环境准备
- JDK 17+:需安装JDK并配置
JAVA_HOME环境变量 - JavaFX SDK:从Gluon官网下载对应版本,解压后配置
JAVA_FX_PATH - WiX Toolset(可选):若需生成MSI安装包,需安装WiX 3.11+
验证流程
-
运行脚本:双击执行
package.bat,观察控制台输出是否成功 -
检查输出:确认
release\项目名称目录包含:项目名称.exe(主程序)runtime(嵌入式JRE)app(应用资源)
-
跨机测试:将整个文件夹复制到无Java环境的Windows机器,双击EXE验证能否运行
常见问题解决
- 错误:找不到主类
检查MAIN_MODULE参数是否与module-info.java中的模块名一致 - JavaFX组件缺失
在jlink命令的--add-modules中添加缺失模块(如javafx.fxml) - 图标不显示
确保ICON_PATH指向有效的.ico文件,建议尺寸256x256像素
通过此方案,可生成完全独立的EXE文件,用户无需安装Java环境即可运行。如需进一步优化体积,可研究GraalVM Native Image技术。