1. 概述

本文将介绍如何在Gradle中创建Fat Jar(也称为uber-jar)。简单来说,Fat Jar是一个自包含的归档文件,它包含了运行应用程序所需的所有类和依赖库。

2. 初始设置

我们先从一个简单的Java项目开始,其build.gradle文件包含两个依赖:

plugins {
   id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    implementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
}

3. 使用Java插件中的Jar任务

我们可以修改Java Gradle插件提供的jar任务。默认情况下,这个任务生成的JAR包不包含任何依赖。

要改变这个行为,需要做两件事:

  1. 在清单文件中添加Main-Class属性
  2. 将依赖JAR包包含进来

修改后的Gradle任务如下:

jar {
    manifest {
        attributes "Main-Class": "com.baeldung.fatjar.Application"
    }

    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

4. 创建独立任务

如果想保留原始的jar任务不变,可以创建一个新任务来完成相同工作。以下代码会添加一个名为customFatJar的任务:

task customFatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.baeldung.fatjar.Application'
    }
    archiveBaseName = 'all-in-one-jar'
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

5. 使用专用插件

还可以使用现有的Gradle插件来构建Fat Jar。这里我们使用Shadow插件:

buildscript {
    repositories {
        mavenCentral()
        gradlePluginPortal()
    }
    dependencies {
        classpath "gradle.plugin.com.github.johnrengelman:shadow:7.1.2"
    }
}
plugins {
  id 'com.github.johnrengelman.shadow' version '7.1.2'
  id 'java'
}

应用Shadow插件后,shadowJar任务就可以直接使用了。

6. 总结

本文介绍了在Gradle中创建Fat Jar的三种方式:

  • 修改默认的jar任务
  • 创建独立任务
  • 使用Shadow插件

哪种方式更推荐?答案取决于具体情况: ✅ 简单项目:修改默认任务或创建新任务足够 ⚠️ 复杂项目:强烈建议使用插件(如Shadow),因为它们已经解决了更棘手的问题(如外部META-INF文件冲突)

完整实现代码可在GitHub查看


原始标题:Creating a Fat Jar in Gradle