Contents

在Gradle中创建 fat jar

1. 概述

在这篇快速文章中,我们将介绍在 Gradle 中创建一个“胖罐子”。

基本上,fat jar(也称为 uber-jar)是一个自给自足的存档,其中包含运行应用程序所需的类和依赖项。

2. 初始设置

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

apply plugin: 'java'
repositories {
    mavenCentral()
}
dependencies {
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
}

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

让我们从修改Java Gradle 插件的jar任务开始。默认情况下,此任务生成没有任何依赖关系的 jars。

我们可以通过添加几行代码来覆盖这种行为。我们需要做两件事来让它工作:

  • 清单文件中的Main-Class属性
  • 包含依赖项 jar

让我们对 Gradle 任务进行一些修改:

jar {
    manifest {
        attributes "Main-Class": "com.blogdemo.fatjar.Application"
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

4. 创建一个单独的任务

如果我们想保持原来的 jar 任务不变,我们可以创建一个单独的任务来完成相同的工作。

以下代码将添加一个名为customFatJar 的新任务:

task customFatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.blogdemo.fatjar.Application'
    }
    baseName = 'all-in-one-jar'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

5. 使用专用插件

我们还可以使用现有的 Gradle 插件来构建一个 fat jar。

在本例中,我们将使用Shadow 插件:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1'
    }
}
apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'

一旦我们应用了 Shadow 插件,shadowJar任务就可以使用了。