如何在 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

.Gson 等类在运行时缺失,抛出 ClassNotFoundException。

正确做法是交由 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) }
    }
}

构建与运行步骤

  1. 在 IntelliJ 右侧 Gradle 工具窗口中,展开项目 → Tasks → build → 双击执行 jar(或终端运行 ./gradlew jar);
  2. 输出路径为:build/libs/your-project-name-1.0-SNAPSHOT.jar;
  3. 终端执行: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?