You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Gradle实现TornadoFX应用Jar包无需额外参数即可运行

解决方案

问题根源

你遇到的报错是因为JDK 11及以上版本已经将JavaFX从内置组件中移除,而你当前的打包配置没有将包含原生代码的平台专属JavaFX依赖打入Jar包,所以运行时会找不到JavaFX相关类。你之前尝试的两种方案无效原因如下:

  • 仅添加OpenJFX Maven构件没指定平台分类器,拉取的是不含原生实现的空依赖,无法正常使用
  • includeBuild是用来引入Gradle子项目的配置,指向本地JavaFX的lib目录完全不符合该配置的使用规则,自然不生效

配置修改步骤

  1. 添加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")
}
  1. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:36:02