如何在 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 】
相关推荐:
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
如何在新浪SAE免费搭建个人博客?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
Thinkphp 中 distinct 的用法解析
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何在云主机上快速搭建多站点网站?
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
音响网站制作视频教程,隆霸音响官方网站?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
JS经典正则表达式笔试题汇总
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
JavaScript如何实现错误处理_try...catch如何捕获异常?
如何在 Pandas 中基于一列条件计算另一列的分组均值
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
BootStrap整体框架之基础布局组件
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
教你用AI将一段旋律扩展成一首完整的曲子
高性能网站服务器部署指南:稳定运行与安全配置优化方案
Laravel API资源类怎么用_Laravel API Resource数据转换
北京网站制作公司哪家好一点,北京租房网站有哪些?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
浅谈redis在项目中的应用
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
Python函数文档自动校验_规范解析【教程】
Laravel如何使用模型观察者?(Observer代码示例)
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
如何用低价快速搭建高质量网站?
Java解压缩zip - 解压缩多个文件或文件夹实例
SQL查询语句优化的实用方法总结
javascript基于原型链的继承及call和apply函数用法分析
如何基于云服务器快速搭建网站及云盘系统?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
javascript如何操作浏览器历史记录_怎样实现无刷新导航
免费视频制作网站,更新又快又好的免费电影网站?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
做企业网站制作流程,企业网站制作基本流程有哪些?
如何在阿里云高效完成企业建站全流程?
如何快速搭建个人网站并优化SEO?

