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


相关推荐: 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中的兼容性问题