Статьи

Начало работы с Gradle: создание бинарного дистрибутива

После того, как мы создали полезное приложение, есть вероятность, что мы хотим поделиться им с другими людьми. Один из способов сделать это — создать бинарный дистрибутив, который можно скачать с нашего сайта.

В этом блоге рассказывается, как мы можем создать бинарный дистрибутив, который отвечает следующим требованиям:

  • Наш бинарный дистрибутив не должен использовать так называемый «толстый кувшин». Другими словами, зависимости нашего приложения не должны быть упакованы в тот же файл jar, что и наше приложение.
  • Наш бинарный дистрибутив должен содержать сценарии запуска для * nix и операционных систем Windows.
  • Корневой каталог нашего двоичного дистрибутива должен содержать лицензию нашего приложения.

Давайте начнем.

Дополнительное чтение:

Создание бинарного распределения

Плагин приложения — это плагин Gradle, который позволяет нам запускать наше приложение, устанавливать его и создавать бинарный дистрибутив, в котором не используется подход «жирной банки».

Мы можем создать бинарный дистрибутив, внеся следующие изменения в файл build.gradle примера приложения, которое мы создали в предыдущей части моего учебного пособия «Начало работы с Gradle» :

  1. Удалите конфигурацию задачи jar .
  2. Примените плагин приложения к нашему проекту.
  3. Настройте основной класс нашего приложения, установив значение свойства mainClassName .

После того, как мы внесли эти изменения в наш файл build.gradle , он выглядит следующим образом (соответствующие части выделены):

01
02
03
04
05
06
07
08
09
10
11
12
13
apply plugin: 'application'
apply plugin: 'java'
 
repositories {
    mavenCentral()
}
 
dependencies {
    compile 'log4j:log4j:1.2.17'
    testCompile 'junit:junit:4.11'
}
 
mainClassName = 'net.petrikainulainen.gradle.HelloWorld'

Плагин приложения добавляет пять задач в наш проект:

  • Задача запуска запускает приложение.
  • Задача startScripts создает сценарии запуска в каталоге build / scripts. Эта задача создает сценарии запуска для операционных систем Windows и * nix.
  • Задача installApp устанавливает приложение в каталог build / install / [имя проекта] .
  • Задача distZip создает бинарный дистрибутив и упаковывает его в zip-файл, который находится в каталоге build / distributions .
  • Задача distTar создает двоичный дистрибутив и упаковывает его в tar-файл, который находится в каталоге build / Distribution .

Мы можем создать бинарный дистрибутив, выполнив одну из следующих команд в корневом каталоге нашего проекта: gradle distZip или gradle distTar . Если мы создадим бинарный дистрибутив, который упакован в zip-файл, посмотрите следующий вывод:

01
02
03
04
05
06
07
08
09
10
11
> gradle distZip
:compileJava
:processResources
:classes
:jar
:startScripts
:distZip
 
BUILD SUCCESSFUL
 
Total time: 4.679 secs

Если мы распаковываем созданный бинарный дистрибутив, созданный плагином приложения, мы получаем следующую структуру каталогов:

  • Каталог bin содержит сценарии запуска.
  • Каталог lib содержит файл jar нашего приложения и его зависимости.

Вы можете получить больше информации о плагине приложения, прочитав главу 45. Плагин приложения Руководства пользователя Gradle .

Теперь мы можем создать бинарный дистрибутив, который удовлетворяет почти всем нашим требованиям. Однако нам все еще нужно добавить лицензию нашего приложения в корневой каталог нашего бинарного дистрибутива. Давайте двигаться дальше и узнаем, как мы можем это сделать.

Добавление файла лицензии нашего приложения в бинарный дистрибутив

Мы можем добавить лицензию нашего приложения в наш бинарный дистрибутив, выполнив следующие действия:

  1. Создайте задачу, которая копирует файл лицензии из корневого каталога нашего проекта в каталог сборки.
  2. Добавьте файл лицензии в корневой каталог созданного двоичного дистрибутива.

Давайте двигаться дальше и более подробно рассмотрим эти шаги.

Копирование файла лицензии в каталог сборки

Имя файла, который содержит лицензию нашего приложения, называется LICENSE , и он находится в корневом каталоге нашего проекта.

Мы можем скопировать файл лицензии в каталог сборки , выполнив следующие действия:

  1. Создайте новую задачу копирования под названием copyLicense .
  2. Настройте исходный файл с помощью метода from () интерфейса CopySpec . Передайте строку «LICENSE» в качестве параметра метода.
  3. Настройте целевой каталог с помощью метода into () интерфейса CopySpec . Передайте значение свойства $ buildDir в качестве параметра метода.

После того, как мы выполнили эти шаги, наш файл build.gradle выглядит следующим образом (соответствующая часть выделена):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
apply plugin: 'application'
apply plugin: 'java'
 
repositories {
    mavenCentral()
}
 
dependencies {
    compile 'log4j:log4j:1.2.17'
    testCompile 'junit:junit:4.11'
}
 
mainClassName = 'net.petrikainulainen.gradle.HelloWorld'
 
task copyLicense(type: Copy) {
    from "LICENSE"
    into "$buildDir"
}

Дополнительная информация:

Теперь мы создали задачу, которая копирует файл LICENSE из корневого каталога нашего проекта в каталог сборки . Однако, когда мы запускаем команду gradle distZip в корневом каталоге нашего проекта, мы видим следующий вывод:

01
02
03
04
05
06
07
08
09
10
11
> gradle distZip
:compileJava
:processResources
:classes
:jar
:startScripts
:distZip
 
BUILD SUCCESSFUL
 
Total time: 4.679 secs

Другими словами, наша новая задача не вызывается, и это, естественно, означает, что файл лицензии не включен в наш двоичный дистрибутив. Давайте исправим эту проблему.

Добавление файла лицензии в бинарный дистрибутив

Мы можем добавить файл лицензии в созданный бинарный дистрибутив, выполнив следующие действия:

  1. Преобразуйте задачу copyLicense из задачи копирования в «обычную» задачу Gradle, удалив строку «(type: Copy)» из ее объявления.
  2. Измените реализацию задачи copyLicense , выполнив следующие действия:
    1. Сконфигурируйте вывод задачи copyLicense . Создайте новый объект File, который указывает на файл лицензии, найденный в каталоге компоновки, и задайте его в качестве значения свойства output.file .
    2. Скопируйте файл лицензии из корневого каталога нашего проекта в каталог сборки.
  3. Плагин приложения устанавливает свойство CopySpec, называемое applicationDistribution, для нашего проекта. Мы можем использовать его для включения файла лицензии в созданный бинарный дистрибутив. Мы можем сделать это, выполнив следующие действия:
    1. Настройте расположение файла лицензии с помощью метода from () интерфейса CopySpec и передайте выходные данные задачи copyLicense в качестве параметра метода.
    2. Настройте целевой каталог с помощью метода into () интерфейса CopySpec и передайте пустую строку в качестве параметра метода.

После того, как мы выполнили эти шаги, наш файл build.gradle выглядит следующим образом (соответствующая часть выделена):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apply plugin: 'application'
apply plugin: 'java'
 
repositories {
    mavenCentral()
}
 
dependencies {
    compile 'log4j:log4j:1.2.17'
    testCompile 'junit:junit:4.11'
}
 
mainClassName = 'net.petrikainulainen.gradle.HelloWorld'
 
task copyLicense {
    outputs.file new File("$buildDir/LICENSE")
    doLast {
        copy {
            from "LICENSE"
            into "$buildDir"
        }
    }
}
 
applicationDistribution.from(copyLicense) {
    into ""
}

Дополнительное чтение:

Когда мы запускаем команду gradle distZip в корневом каталоге нашего проекта, мы видим следующий вывод:

01
02
03
04
05
06
07
08
09
10
11
12
> gradle distZip
:copyLicense
:compileJava
:processResources
:classes
:jar
:startScripts
:distZip
 
BUILD SUCCESSFUL
 
Total time: 5.594 secs

Как мы видим, задача copyLicense теперь вызывается, и если мы распаковываем наш двоичный дистрибутив, мы замечаем, что файл LICENSE находится в его корневом каталоге.

Давайте перейдем к обобщению того, что мы узнали из этого поста в блоге.

Резюме

Этот пост научил нас трем вещам:

  • Мы узнали, что мы можем создать бинарный дистрибутив с помощью плагина приложения.
  • Мы узнали, как можно скопировать файл из исходного каталога в целевой каталог с помощью задачи « Копировать» .
  • Мы узнали, как мы можем добавлять файлы в бинарный дистрибутив, который создается плагином приложения.

Если вы хотите поиграть с примером приложения из этого блога, вы можете получить его у Github .