Статьи

Начало работы с Gradle: наш первый Java-проект

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

Наш Java-проект имеет только одно требование:

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

1
java -jar jarfile.jar

Давайте выясним, как мы можем выполнить это требование.

Создание проекта Java

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

1
apply plugin: 'java'

Вот и все. Теперь мы создали проект Java.

Плагин Java добавляет новые соглашения (например, макет проекта по умолчанию), новые задачи и новые свойства в нашу сборку.

Давайте двигаться дальше и кратко рассмотрим макет проекта по умолчанию.

Макет проекта Java-проекта

Макет проекта по умолчанию для проекта Java следующий:

  • Каталог src / main / java содержит исходный код нашего проекта.
  • Каталог src / main / resources содержит ресурсы (такие как файлы свойств) нашего проекта.
  • Каталог src / test / java содержит тестовые классы.
  • Каталог src / test / resources содержит тестовые ресурсы.

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

  • Каталог классов содержит скомпилированные файлы .class .
  • Каталог libs содержит файлы jar или war, созданные при сборке.

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

Добавление основного класса в нашу сборку

Давайте создадим простой основной класс, который печатает слова «Hello World» в System.out . Исходный код класса HelloWorld выглядит следующим образом:

1
2
3
4
5
6
7
8
package net.petrikainulainen.gradle;
 
public class HelloWorld {
 
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Класс HelloWorld был добавлен в каталог src / main / java / net / petrikainulainen / gradle .

Это мило. Однако нам все еще нужно скомпилировать и упаковать наш проект. Давайте двигаться дальше и посмотрим на задачи проекта Java.

Задачи проекта Java

Плагин Java добавляет много задач в нашу сборку, но задачи, которые имеют отношение к этой записи блога:

  • Задача сборки компилирует исходный код нашего приложения и упаковывает его в файл JAR. Эта задача не запускает юнит-тесты.
  • Задача сборки выполняет полную сборку проекта.
  • Чистая задача удаляет каталог сборки.
  • Задача compileJava компилирует исходный код нашего приложения.

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

1
gradle tasks

Это хороший способ получить краткий обзор нашего проекта без чтения скрипта сборки. Если мы запустим эту команду в корневом каталоге нашего примера проекта, мы увидим следующий вывод:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
> gradle tasks
:tasks
 
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
 
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles classes 'main'.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles classes 'test'.
 
Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]
 
Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.
 
Help tasks
----------
dependencies - Displays all dependencies declared in root project 'first-java-project'.
dependencyInsight - Displays the insight into a specific dependency in root project 'first-java-project'.
help - Displays a help message
projects - Displays the sub-projects of root project 'first-java-project'.
properties - Displays the properties of root project 'first-java-project'.
tasks - Displays the tasks runnable from root project 'first-java-project'.
 
Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.
 
Rules
-----
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.
Pattern: clean<TaskName>: Cleans the output files of a task.
 
To see all tasks and more detail, run with --all.
 
BUILD SUCCESSFUL
 
Total time: 2.792 secs

Давайте продолжим и узнаем, как мы можем упаковать наш Java-проект.

Упаковка нашего проекта Java

Мы можем упаковать наше приложение, используя две разные задачи:

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

01
02
03
04
05
06
07
08
09
10
> gradle assemble
:compileJava
:processResources
:classes
:jar
:assemble
 
BUILD SUCCESSFUL
 
Total time: 3.163 secs

Если мы запустим команду gradle build в командной строке, мы увидим следующий вывод:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
 
BUILD SUCCESSFUL
 
Total time: 3.01 secs

Выводы этих команд демонстрируют, что различие этих задач заключается в том, что:

  • Задача сборки выполняет только те задачи, которые необходимы для упаковки нашего приложения.
  • Задача сборки выполняет задачи, необходимые для упаковки нашего приложения, и запускает автоматические тесты.

Обе эти команды создают файл first-java-project.jar в каталоге build / libs .

Имя по умолчанию для созданного файла JAR создается с использованием следующего шаблона: [имя проекта] .jar , а имя проекта по умолчанию совпадает с именем каталога, в котором он был создан. Поскольку имя нашего каталога проектов — first-java-project , имя созданного jar — first-java-project.jar .

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

1
java -jar first-java-project.jar

Когда мы делаем это, мы видим следующий вывод:

1
2
> java -jar first-java.project.jar
No main manifest attribute, in first-java-project.jar

Проблема в том, что мы не настроили основной класс файла jar в файле манифеста. Давайте выясним, как мы можем решить эту проблему.

Настройка основного класса файла JAR

Плагин Java добавляет задачу jar в наш проект, и каждый объект jar имеет свойство manifest, которое является экземпляром Manifest .

Мы можем настроить основной класс созданного jar-файла, используя метод attribute () интерфейса Manifest . Другими словами, мы можем указать атрибуты, добавленные в файл манифеста, используя карту, которая содержит пары ключ-значение.

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

1
2
3
4
5
6
7
apply plugin: 'java'
 
jar {
    manifest {
        attributes 'Main-Class': 'net.petrikainulainen.gradle.HelloWorld'
    }
}

Учебник по Java SE предоставляет больше информации о файле манифеста .

После того, как мы создали новый файл jar, выполнив команду gradle assembly или gradle build , мы можем запустить файл jar с помощью следующей команды:

1
java -jar first-java-project.jar

Когда мы запускаем наше приложение, в System.out выводится следующий текст:

1
2
> java -jar first-java-project.jar
Hello World!

Это все на сегодня. Давайте узнаем, что мы узнали из этого поста в блоге.

Резюме

Теперь мы создали простой Java-проект с использованием Gradle. Этот пост научил нас четырем вещам:

  • Мы знаем, что можем создать проект Java, применив подключаемый модуль Gradle Java.
  • Мы узнали, что макет каталога по умолчанию проекта Java такой же, как макет каталога по умолчанию проекта Maven.
  • Мы узнали, что все выходные файлы, созданные нашей сборкой, можно найти в каталоге сборки .
  • Мы узнали, как мы можем настроить атрибуты, добавленные в файл манифеста.

PS Пример проекта этого блога доступен на Github .