如何配置Gradle实现TornadoFX应用Jar包无需额外参数即可运行
解决方案
问题根源
你遇到的报错是因为JDK 11及以上版本已经将JavaFX从内置组件中移除,而你当前的打包配置没有将包含原生代码的平台专属JavaFX依赖打入Jar包,所以运行时会找不到JavaFX相关类。你之前尝试的两种方案无效原因如下:
- 仅添加OpenJFX Maven构件没指定平台分类器,拉取的是不含原生实现的空依赖,无法正常使用
includeBuild是用来引入Gradle子项目的配置,指向本地JavaFX的lib目录完全不符合该配置的使用规则,自然不生效
配置修改步骤
- 添加JavaFX跨平台依赖
在build.gradle.kts的dependencies代码块中增加如下配置,按需引入你用到的JavaFX模块,同时支持Windows、Linux、Mac三个平台:
val javafxVersion = "11.0.2" val requiredJavaFxModules = listOf("base", "controls", "graphics", "fxml") listOf("win", "linux", "mac").forEach { platform -> requiredJavaFxModules.forEach { module -> implementation("org.openjfx:javafx-$module:$javafxVersion:$platform") } }
如果只需要针对当前编译设备的平台打包,可以根据操作系统自动匹配对应平台的依赖,减少Jar包体积:
val javafxVersion = "11.0.2" val requiredJavaFxModules = listOf("base", "controls", "graphics", "fxml") val osName = System.getProperty("os.name").lowercase() val currentPlatform = when { osName.contains("win") -> "win" osName.contains("mac") -> "mac" osName.contains("linux") -> "linux" else -> throw GradleException("不支持当前操作系统") } requiredJavaFxModules.forEach { module -> implementation("org.openjfx:javafx-$module:$javafxVersion:$currentPlatform") }
- 调整Jar打包配置
修改你现有的Jar任务配置,处理重复文件、排除签名冲突内容,同时适配多版本Jar规则:
tasks.withType<Jar> { manifest { attributes["Main-Class"] = application.mainClassName attributes["Multi-Release"] = "true" } from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }) duplicatesStrategy = DuplicatesStrategy.EXCLUDE exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA", "module-info.class") }
验证
重新执行gradle jar构建Jar包,之后直接运行java -jar App.jar即可正常启动,不需要额外添加JavaFX模块参数。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

