如何在 IntelliJ 中构建包含外部依赖的可执行 JAR(Fat JAR)
发布时间 - 2026-01-31 00:00:00 点击率:次本文详解如何通过 gradle 配置生成真正自包含的可执行 jar(即“胖 jar”),解决因 `noclassdeffounderror` 导致的运行失败问题,确保 `gson` 等第三方依赖被完整打包进 jar。
在 IntelliJ 中仅通过「Artifacts → From module with dependencies」导出 JAR 并不能保证所有依赖类被正确合并——尤其当使用 Gradle 作为构建工具时,IDE 的 GUI 打包流程常与 Gradle 的依赖解析机制脱节,导致 com.google.gson

正确做法是交由 Gradle 构建一个“Fat JAR”:将项目编译类 + 所有 runtimeClasspath 依赖(如 Gson)一并解压、合并到单个 JAR 中,并自动配置 MANIFEST.MF 的 Main-Class 属性。
以下是关键配置(build.gradle):
plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'com.google.code.gson:gson:2.10.1' // ✅ 使用 implementation(非 compile,已弃用)
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}
// ✅ 关键:定义 fat jar 任务(覆盖默认 jar 任务)
jar {
manifest {
attributes "Main-Class": "org.example.Main" // 替换为你的实际主类全限定名
}
// 将所有 runtime 依赖的 class 文件解压后合并进当前 jar
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}✅ 构建与运行步骤:
- 在 IntelliJ 右侧 Gradle 工具窗口中,展开项目 → Tasks → build → 双击执行 jar(或终端运行 ./gradlew jar);
- 输出路径为:build/libs/your-project-name-1.0-SNAPSHOT.jar;
- 终端执行:java -jar build/libs/your-project-name-1.0-SNAPSHOT.jar —— 无需额外 -cp 或外部 JAR。
⚠️ 注意事项:
- 确保 Main-Class 值准确(含包名),且对应类中存在 public static void main(String[]) 方法;
- 若依赖含 META-INF/MANIFEST.MF 或服务文件(如 META-INF/services/),建议改用 shadowJar 插件(com.github.johnrengelman.shadow) 避免资源冲突;
- IntelliJ 的 GUI Artifact 打包应禁用(避免重复构建),以 Gradle 为准,保持构建逻辑统一;
- JDK 17+ 用户需注意:若依赖含非法反射调用,可能需添加 --add-opens 参数,但 Fat JAR 本身不改变 JVM 启动策略。
至此,你获得的是一个真正独立、零外部依赖的可执行 JAR——双击运行或服务器部署均无需额外配置 classpath。
# java
# git
# go
# github
# 工具
# ai
# 解压
# google
# jvm
# Static
# String
# void
# class
# public
# ide
# gradle
# 双击
# 可执行
# 的是
# 并不能
# 第三方
# 抛出
# 不改变
# 类中
# 正自
# 均无
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel distinct去重查询_Laravel Eloquent去重方法
手机网站制作与建设方案,手机网站如何建设?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
七夕网站制作视频,七夕大促活动怎么报名?
如何撰写建站申请书?关键要点有哪些?
长沙企业网站制作哪家好,长沙水业集团官方网站?
Laravel如何实现多对多模型关联?(Eloquent教程)
Android自定义控件实现温度旋转按钮效果
教学论文网站制作软件有哪些,写论文用什么软件
?
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
android nfc常用标签读取总结
如何在IIS中新建站点并配置端口与IP地址?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
LinuxCD持续部署教程_自动发布与回滚机制
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何快速搭建个人网站并优化SEO?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel中的Facade(门面)到底是什么原理
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
如何快速生成凡客建站的专业级图册?
如何快速启动建站代理加盟业务?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
如何在阿里云域名上完成建站全流程?
北京专业网站制作设计师招聘,北京白云观官方网站?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
使用Dockerfile构建java web环境
Laravel怎么使用Intervention Image库处理图片上传和缩放
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
怎么用AI帮你设计一套个性化的手机App图标?
如何挑选最适合建站的高性能VPS主机?
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
phpredis提高消息队列的实时性方法(推荐)
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
黑客如何通过漏洞一步步攻陷网站服务器?
JavaScript常见的五种数组去重的方式
Laravel如何配置Horizon来管理队列?(安装和使用)
Swift中swift中的switch 语句
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
南京网站制作费用,南京远驱官方网站?
Laravel如何使用模型观察者?(Observer代码示例)
如何解决hover在ie6中的兼容性问题

