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

JavaFX Gradle应用运行时出现NoClassDefFoundError:找不到Gson/StringUtils

解决JavaFX Gradle项目运行时NoClassDefFoundError问题

你遇到的核心问题是运行时找不到依赖类,这是因为Gradle默认的jar任务只打包了你自己的代码,并没有把Gson、Apache Commons Lang这些第三方依赖包含进去。虽然你在manifest里配置了Class-Path,但这个路径是相对运行环境的——如果执行jar时这些依赖jar不在指定的相对路径下,JVM就会抛出NoClassDefFoundError。

下面给你三种可行的解决方案,按推荐程度排序:


方案1:用Shadow插件打包成Fat Jar(最省心)

Shadow插件可以把你的代码+所有依赖打包成一个单独的可执行Jar,彻底避免依赖路径问题。

操作步骤:

  1. 在buildscript块中添加Shadow插件的依赖:
buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath group: 'de.dynamicfiles.projects.gradle.plugins', name: 'javafx-gradle-plugin', version: '8.8.2'
        // 添加Shadow插件依赖
        classpath 'com.github.jengelman.gradle.plugins:shadow:7.1.2'
    }
}
  1. 应用Shadow插件:
apply plugin: 'java'
apply plugin: 'javafx-gradle-plugin'
apply plugin: 'com.github.johnrengelman.shadow' // 新增这一行
  1. 配置ShadowJar的主类(和你现有manifest保持一致):
shadowJar {
    manifest {
        attributes 'Main-Class': 'eagleview.App'
    }
}
  1. 执行构建命令:
./gradlew shadowJar

生成的Fat Jar会在build/libs/目录下,文件名格式是[项目名]-[版本]-all.jar(比如eagleview-1.0-SNAPSHOT-all.jar),直接运行这个Jar就可以正常使用依赖类了。


方案2:手动管理依赖Jar路径

如果你不想打包成Fat Jar,可以让Gradle把依赖Jar复制到主Jar的同一目录,确保Class-Path能正确找到它们。

操作步骤:

  1. 在build.gradle中添加一个复制依赖的任务:
// 复制依赖Jar到build/libs目录
task copyDependencies(type: Copy) {
    from configurations.compile
    into "${buildDir}/libs"
}
  1. 让jar任务依赖这个复制任务,确保构建时自动复制依赖:
jar.dependsOn copyDependencies
  1. 执行构建:
./gradlew build

完成后build/libs目录下会同时存在你的主Jar和所有依赖Jar,直接在该目录下执行java -jar eagleview-1.0-SNAPSHOT.jar即可。


方案3:利用javafx-gradle-plugin的jfxJar任务

你已经引入了javafx-gradle-plugin,这个插件的jfxJar任务专门为JavaFX项目优化,可以自动处理依赖打包。

操作步骤:

  1. 修改jfx配置块,让它包含第三方依赖:
jfx {
    mainClass = 'eagleview.App'
    vendor = 'eagleview'
    
    // 配置jfxJar任务,将第三方依赖打包进去
    jfxJar {
        from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
  1. 执行构建命令:
./gradlew jfxJar

生成的可执行Jar在build/jfx/app/目录下,直接运行即可。


额外提示:

  • 推荐优先使用方案1,因为Fat Jar不需要额外管理依赖路径,分发起来更方便。
  • 如果你后续需要打包成原生应用,可以继续使用javafx-gradle-plugin的jfxNative任务,它会处理所有依赖和JavaFX运行时的打包。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:24:00