在Gradle中创建一个胖子罐

Creating a Fat Jar in Gradle

1.概述

在这篇快速文章中,我们将介绍在Gradle中创建"胖罐"。

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

2.初始设置

让我们从一个具有两个依赖关系的Java项目的简单build.gradle文件开始:

1
2
3
4
5
6
7
8
9
10
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任务开始。默认情况下,此任务会生成没有任何依赖关系的jar。

我们可以通过添加几行代码来覆盖此行为。我们需要使它起作用的两件事:

  • 清单文件中的Main-Class属性

  • 包括依赖罐

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    jar {
        manifest {
            attributes"Main-Class":"com.baeldung.fatjar.Application"
        }

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

    4.创建一个单独的任务

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    task customFatJar(type: Jar) {
        manifest {
            attributes 'Main-Class': 'com.baeldung.fatjar.Application'
        }
        baseName = 'all-in-one-jar'
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
        with jar
    }

    5.使用专用插件

    我们也可以使用现有的Gradle插件来构建胖子。

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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任务。

    六,结论

    在本教程中,我们介绍了在Gradle中创建胖罐的几种不同方法。我们覆盖了默认的jar任务,创建了一个单独的任务,并使用了影子插件。

    建议使用哪种方法?答案是–这取决于。

    在简单的项目中,只要覆盖默认的jar任务或创建一个新的jar任务就足够了。但是随着项目的发展,我们强烈建议使用插件,因为它们已经解决了更棘手的问题,例如与外部META-INF文件的冲突。

    与往常一样,可以在GitHub上找到本教程的完整实现。