JavaFX打包成Fat Jar后运行报错:缺少运行时组件,如何解决?
解决方案
1. 升级JavaFX Gradle插件版本
旧版0.1.0功能有限,替换为适配Java 17的新版本:
plugins { id 'application' id 'org.openjfx.javafxplugin' version '0.17.0' // 可选:添加shadow插件,更便捷生成fat jar id 'com.github.johnrengelman.shadow' version '8.1.1' }
2. 移除重复的JavaFX依赖
javafxplugin会根据javafx块配置自动引入对应依赖,删除dependencies中重复的JavaFX条目:
dependencies { implementation 'com.google.code.gson:gson:2.10.1' compileOnly 'org.projectlombok:lombok:1.18.30' annotationProcessor 'org.projectlombok:lombok:1.18.30' // 移除以下重复依赖 // implementation 'org.openjfx:javafx-controls:21.0.2' // implementation 'org.openjfx:javafx-web:21.0.2' }
3. 调整主类(关键修复)
如果你的launcher.Launcher直接继承javafx.application.Application,必须改为间接启动:
创建普通主类launcher.AppStarter,在其中启动JavaFX应用:
package launcher; import javafx.application.Application; public class AppStarter { public static void main(String[] args) { Application.launch(Launcher.class, args); } }
修改Gradle主类配置:
mainClassName = "launcher.AppStarter" // 若使用shadow插件,同步指定主类 shadowJar { manifest { attributes 'Main-Class': 'launcher.AppStarter' } }
4. 修复Fat Jar打包配置(二选一)
选项A:使用Shadow插件(推荐)
Shadow插件对JavaFX模块化支持更完善,执行命令生成fat jar:
./gradlew shadowJar
生成的jar文件位于build/libs/目录下。
选项B:修改自定义fatJar任务
若坚持使用自定义任务,调整配置确保包含JavaFX运行时:
task fatJar(type: Jar) { duplicatesStrategy = DuplicatesStrategy.EXCLUDE manifest { attributes 'Main-Class': 'launcher.AppStarter' // 添加模块属性适配JavaFX模块化要求 attributes 'Module-Classpath': configurations.runtimeClasspath.files.collect { it.name }.join(' ') } from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } from sourceSets.main.output }
5. 运行Fat Jar的正确命令
JavaFX仍需模块参数支持,运行命令如下:
java --add-modules javafx.controls,javafx.web -jar your-project-1.0.jar
内容的提问来源于stack exchange,提问作者токсичный kineJon
相关产品推荐
相关产品推荐

