基于Java 23与JavaFX创建可执行应用的问题求助
解决JavaFX Windows可执行文件构建问题的几种方案
针对你的情况(OpenJDK 23、Windows平台、存在非模块化依赖),以下是几个更优的构建方案:
方案1:使用官方javafx-maven-plugin打包自包含应用
这是JavaFX官方推荐的打包方式,可自动处理JavaFX的原生组件,无需手动指定SDK路径:
- 在Maven的pom.xml中添加插件配置:
<plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>23</version> <configuration> <!-- 替换为你的主类全路径 --> <mainClass>com.yourpackage.YourMainClass</mainClass> <!-- 仅打包Windows平台 --> <platforms> <platform>win</platform> </platforms> <!-- 跳过模块检查,适配非模块化依赖 --> <skipModuleCheck>true</skipModuleCheck> <!-- 根据项目需求调整JavaFX模块 --> <modules> <module>javafx.controls</module> <module>javafx.fxml</module> </modules> </configuration> <executions> <execution> <id>default-cli</id> <phase>package</phase> <goals> <goal>jlink</goal> <goal>jpackage</goal> </goals> </execution> </executions> </plugin>
- 执行Maven命令:
mvn clean package
执行完成后,target目录下会生成包含JRE、JavaFX运行时和应用的独立文件夹,里面直接有可执行exe文件,无需外部依赖。
方案2:直接使用JDK自带的jpackage工具
jpackage是JDK 16+内置的打包工具,支持将Java应用打包成原生可执行文件,兼容非模块化项目:
- 先用maven-shade-plugin生成包含所有依赖的jar包
- 打开命令行,进入项目根目录,执行以下命令(替换为你的实际参数):
jpackage --type exe ^ --input target ^ --name YourAppName ^ --main-jar your-shaded-jar-file.jar ^ --main-class com.yourpackage.YourMainClass ^ --add-modules javafx.controls,javafx.fxml ^ --module-path "path/to/javafx-sdk-23/lib" ^ --runtime-image target/jre ^ --dest target/dist
--type exe:指定生成Windows可执行文件--input:jar包所在目录--main-jar:你的shade jar文件名--main-class:主类全路径--add-modules:添加需要的JavaFX模块--module-path:指向本地JavaFX SDK的lib目录--runtime-image:生成绑定到exe中的JRE镜像目录
执行后,target/dist目录下会生成独立的exe安装包或绿色版应用,无需用户额外安装JRE。
方案3:优化Launch4j配置(无需固定绝对路径)
如果想继续用Launch4j,可通过相对路径解决SDK依赖问题:
- 将JavaFX SDK的
lib文件夹复制到应用目录下(比如放在app/lib/javafx-lib) - 在Launch4j配置中设置VM参数:
--module-path ./lib/javafx-lib --add-modules javafx.controls,javafx.fxml
- 配置绑定JRE:选择
Bundle JRE,指定JRE的相对路径(比如将JRE放在app/jre目录下)
打包后的应用可携带自身的JRE和JavaFX组件,路径为相对路径,不受安装位置影响。
补充说明
- shade jar运行报错原因:JavaFX包含原生平台组件(.dll文件等),无法被shade到jar中,必须通过
--module-path指定或打包到应用目录。 - 非模块化依赖处理:上述方案均支持混合模块化/非模块化项目,无需强制添加
module-info.java,通过--add-modules和skipModuleCheck即可绕过模块检查。
内容的提问来源于stack exchange,提问作者Gabriel Alberto Pérez Guerra
相关产品推荐
相关产品推荐

