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

使用Gradle构建Jar包时出现java.lang.NoClassDefFoundError问题求助

问题原因与解决方案

问题根源

默认gradlew build生成的Jar包是瘦Jar——只包含你自己项目的编译代码,不会把implementation声明的第三方依赖(比如Gson、Guava)打包进去。在VSCode里直接运行时,IDE会自动把依赖库加入JVM的类路径,所以能正常执行;但单独运行这个Jar时,JVM找不到Gson这些依赖类,就会抛出NoClassDefFoundError。


解决方案(三种常用方式)

方案1:用Shadow插件打包成胖Jar(最推荐)

Shadow插件能把所有依赖库和你的代码打包成一个独立的可执行Jar,运行时不用额外处理依赖。

  1. 在build.gradle的plugins块里添加Shadow插件:
plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.2' // 版本可根据你的Gradle版本调整
}
  1. 保留你原来的dependencies和jar配置不变,执行打包命令:
./gradlew shadowJar
  1. 生成的胖Jar在build/libs/目录下,文件名一般是[你的项目名]-all.jar,直接运行就行:
java -jar build/libs/[你的项目名]-all.jar

方案2:手动修改Jar任务打包依赖

不想用插件的话,可以直接修改jar任务,把依赖库的内容合并到Jar里:

jar {
    manifest {
        attributes(
                'Main-Class': 'analyser.Run'
        )
    }
    // 把所有运行时依赖的内容合并到当前Jar
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
    // 排除重复的签名文件,避免打包冲突
    exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
}

执行./gradlew build后,生成的Jar就是包含所有依赖的可执行Jar,直接运行即可。

方案3:用Application插件生成启动脚本

Application插件会自动生成带类路径配置的启动脚本,不用手动处理依赖路径:

  1. 在build.gradle里添加插件并指定主类:
plugins {
    id 'java'
    id 'application'
}

application {
    mainClass.set('analyser.Run')
}
  1. 执行命令生成启动脚本:
./gradlew installDist
  1. 运行脚本:
# Linux/Mac系统
./build/install/[你的项目名]/bin/[你的项目名]
# Windows系统
build\install\[你的项目名]\bin\[你的项目名].bat

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:50:24