В этом блоге рассказывается, как мы можем скомпилировать и упаковать простой 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 .
Ссылка: | Начало работы с Gradle: наш первый Java-проект от нашего партнера JCG |