Перейти к основному содержимому

Создание толстой банки в Gradle

· 2 мин. чтения

1. Обзор

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

По сути, толстый jar (также известный как uber-jar) — это самодостаточный архив, который содержит как классы, так и зависимости, необходимые для запуска приложения.

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. По умолчанию эта задача создает банки без каких-либо зависимостей.

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

  • атрибут Main-Class в файле манифеста
  • Включить банки зависимостей

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

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

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

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

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

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

task customFatJar(type: Jar) {
manifest {
attributes 'Main-Class': 'com.foreach.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 по умолчанию, создали отдельную задачу и использовали теневой плагин.

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

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

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