Создание Fat Jar в Gradle

Создание Fat Jar в Gradle

1. обзор

В этой быстрой статье мы рассмотрим создание «толстой банки» в Gradle.

В основномa fat jar (also known as uber-jar) is a self-sufficient archive which contains both classes and dependencies needed to run an application.

2. Начальная настройка

Начнем с простого файлаbuild.gradle для проекта Java с двумя зависимостями:

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. Использование задачи Jar из подключаемого модуля Java

Начнем с изменения задачиjar из подключаемого модуля Java Gradle. По умолчанию эта задача создает файлы JAR без каких-либо зависимостей.

Мы можем переписать это поведение, добавив несколько строк кода. Нам нужно две вещи, чтобы это работало:

  • атрибутMain-Class в файле манифеста

  • Включить зависимости jar

Давайте добавим несколько изменений в задачу Gradle:

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

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

4. Создание отдельной задачи

Если мы хотим оставить исходную задачу jar как есть, мы можем создать отдельную задачу, которая будет выполнять ту же работу.

Следующий код добавит новую задачу под названиемcustomFatJar:

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

5. Использование выделенных плагинов

Мы также можем использовать существующие плагины Gradle для создания толстой банки.

В этом примере мы будем использовать плагин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 будет готова к использованию.

6. Заключение

В этом уроке мы представили несколько разных способов создания толстых банок в Gradle. Мы переопределили стандартную задачу jar, создали отдельную задачу и использовали плагин shadow.

Какой подход рекомендуется? Ответ - это зависит.

В простых проектах достаточно переопределить задачу jar по умолчанию или создать новую. Но по мере роста проекта мы настоятельно рекомендуем использовать плагины, потому что они уже решили более сложные проблемы, такие как конфликты с внешними файлами META-INF.

Как всегда, полную реализацию этого руководства можно найти вover on GitHub.