Сборка Java-проекта с помощью Gradle

4 minute read

В этом посте мы создадим простейшее приложение на Java и соберем его с помощью системы сборки Gradle. Для этого от вас потребуется:

  • Около 15 минут времени
  • Любимый текстовый редактор
  • JDK версии 6+

Настройка проекта

Сперва создадим простейшее приложение на Java, которое нам нужно будет собрать. Создайте следующую структуру каталогов в вашей папке с проектами:

simple_java_project_with_gradle/src/main/java/hello

И поместите туда два файла (HelloWorld.java и Greeter.java):

package hello;

public class HelloWorld {
  public static void main(String[] args) {
    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}
package hello;

public class Greeter {
  public String sayHello() {
    return "Hello world!";
  }
}

Установка Gradle

Теперь, когда у нас есть простейший Java-проект, который мы хотим собрать, настало время установить Gradle. Gradle можно скачать в виде zip-архива тут. Нам нужны только бинарники, так что ищите ссылку на скачивание вида gradle-version-bin.zip. Также вы можете скачать gradle-version-all.zip, чтобы получить исходники и документацию в дополнение к бинарникам.

Распакуйте файл и добавьте путь к каталогу /bin в cистемную переменную PATH. Для того, чтобы протестировать установку, запустите из командной строки следующую команду:

gradle

Если все пойдет хорошо, вы увидите приветственное сообщение:

:help

Welcome to Gradle 2.0.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
BUILD SUCCESSFUL

Total time: 2.675 secs
You now have Gradle installed.

Это значит, что Gradle успешно установился на вашем компьютере.

Что может Gradle

Теперь, когда Gradle установлен, посмотрим, что он может. Для этого вам нужно спросить у Gradle, какие задачи вам доступны:

gradle tasks

Выполнив эту команду, вы сможете увидеть список доступных задач. Если вы запустите эту команду не из каталога, где есть build.gradle файл, скорее всего, вы увидите примерно такой список:

:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Help tasks
----------
dependencies - Displays all dependencies declared in root project 'user'.
dependencyInsight - Displays the insight into a specific dependency in root proj
ect 'user'.
help - Displays a help message
projects - Displays the sub-projects of root project 'user'.
properties - Displays the properties of root project 'user'.
tasks - Displays the tasks runnable from root project 'user'.

To see all tasks and more detail, run with --all.

BUILD SUCCESSFUL

Total time: 2.718 secs

Сборка Java-проекта

Создадим простейший текстовый файл build.gradle, который поместим в корень нашего проекта. Добавим туда только лишь одну строку:

apply plugin: 'java'

Эта единственная строка в нашей конфигурации сборки проекта привносит огромное количество возможностей. Запустите команду ‘gradle tasks‘ снова и вы увидите новые задачи, добавленные в список, включая задачи для сборки проекта, создания Javadoc и выполнения unit-тестов.

Часто вы будете использовать задачу ‘gradle build‘. Эта задача компилирует программный код, запускает unit-тесты и собирает результаты компиляции в JAR-файлы. Вы можете запустить ее следующим образом:

gradle build

Через несколько секунд вы увидите сообщение “BUILD SUCCESSFUL”, подтверждающее, что сборка была завершена успешно. Для того, чтобы увидеть результаты сборки, загляните в каталог /build – вы увидите там несколько директорий, включая следующие:

  • /classes – содержит cкомпилированные .class файлы проекта (включая наши HelloWorld.class и Greeter.class);
  • /reports – содержит отчеты, созданные в результате сборки (например отчеты по выполнению unit-тестов);
  • /libs – содержит создаваемые проектные библиотеки (обычно JAR- и/или WAR-файлы);
  • /dependency_cache – содержит зависимости, необходимые для сборки (на данный момент проект не содержит никаких зависимостей и поэтому здесь ничего нет).

Работа с зависимостями

Наше простейшее приложение ‘Hello world!‘ полностью независимо от сторонних и дополнительных библиотек. Однако большинство приложений часто имеют зависимости от внешних библиотек при использовании уже готовой функциональности.

Для примера представим, что вы хотите, чтобы наше приложение в дополнение к строчке “Hello World!” печатало текущую дату и время. Для этих целей вы, конечно, можете использовать возможности JDK, но давайте используем возможности библиотеки Joda Time.

Сперва измените файл HelloWorld.java следующим образом:

package hello;

import org.joda.time.LocalTime;

public class HelloWorld {
  public static void main(String[] args) {
    LocalTime currentTime = new LocalTime();
    System.out.println("The current local time is: " + currentTime);

    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}

Здесь в классе HelloWorld используется класс LocalTime из библиотеки Joda Time для получения текущего времени. Если вы сейчас запустите сборку с помощью задачи ‘gradle build‘, то увидите, что она завершится ошибкой. Это произойдет из-за того, что вы не объявили библиотеку Joda Time как компилируемую зависимость в файле build.gradle. Чтобы исправить это, вам нужно сперва добавить в build.gradle источник для сторонних библиотек (так называемых 3rd party libraries):

repositories {
    mavenCentral()
}

Блок repositories показывает, что при сборке все зависимости должны быть взяты из репозитория Maven Central. Gradle очень много взял от системы сборки Maven, включая возможность использовать Maven Central как источник зависимостей.

Теперь, когда мы готовы к использованию сторонних библиотек, давайте их объявим:

dependencies {
    compile "joda-time:joda-time:2.2"
}

В блоке dependencies вы объявляете единственную зависимость от Joda Time. Если говорить точнее, вы указываете (читая справа налево), что вам нужна версия 2.2 библиотеки joda-time в группе joda-time.

Еще стоит заметить, что данная зависимость имеет тип compile. Это означает, что она будет доступна во время компиляции (если вы будете собирать WAR-файл, она будет включена в соответствующий каталог /WEB-INF/libs).

Другие возможные типы зависимостей:

  • providedCompile – зависимость требуется для компиляции, но предполагается, что в дальнейшем она будет поставляться контейнером, исполняющим код;
  • testCompile – зависимость используется для компиляции и выполнения тестов, но не требуется на этапе выполнения программы.

Наконец, давайте зададим блок jar:

jar {
    baseName = 'gs-gradle'
    version =  '0.1.0'
}

Блок jar определяет, как будет называться итоговый JAR-файл. В нашем случае сгенерится gs-gradle-0.1.0.jar. Если вы сейчас запустите сборку с помощью команды ‘gradle build‘, Gradle должен использовать зависимость Joda Time из репозитория Maven Central. В результате, сборка пройдет без ошибок.

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

По мотивам: Building Java Projects with Gradle

Leave a Comment