Зачем нужна система сборки
Вручную компилировать десятки файлов, скачивать библиотеки с их зависимостями, запускать тесты и упаковывать jar неудобно. Система сборки делает это одной командой и одинаково на любой машине.
Две основные системы:
| Maven | Gradle | |
|---|---|---|
| Конфигурация | XML (pom.xml) | Groovy или Kotlin DSL (build.gradle, build.gradle.kts) |
| Подход | соглашения и жизненный цикл | гибкие задачи |
| Скорость | медленнее | быстрее благодаря кэшу и демону |
| Использование | очень распространен в корпоративной разработке | стандарт в Android, популярен в новых проектах |
Репозиторий библиотек у обоих — Maven Central (central.sonatype.com или search.maven.org).
Установка
Maven
sudo apt install mavenbrew install mavenВ Windows: winget install Apache.Maven. Проверка:
mvn -versionGradle
sdk install gradlebrew install gradleВ Windows: winget install Gradle.Gradle. Проверка:
gradle -versionДля проектов принято использовать wrapper (mvnw, gradlew): скрипт в репозитории сам скачивает нужную версию системы сборки. Тогда ставить Maven или Gradle глобально не обязательно.
Maven
Создание проекта
mvn archetype:generate -DgroupId=com.example -DartifactId=demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=falseIDE тоже умеют создавать Maven-проекты: IntelliJ IDEA → New Project → Maven, Eclipse → New → Maven Project, VS Code → команда Java: Create Java Project → Maven.
Файл pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <properties> <maven.compiler.release>21</maven.compiler.release> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.11.0</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.5.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.4.2</version> <configuration> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build></project>Координаты артефакта:
groupId— организация или проект (обратный домен);artifactId— имя модуля;version— версия.
Точные актуальные версии библиотек смотрите на Maven Central: приведенные здесь номера служат примером.
Области видимости зависимостей
| Scope | Назначение |
|---|---|
compile (по умолчанию) | нужна везде |
test | только для тестов |
provided | нужна при компиляции, на сервере будет предоставлена |
runtime | нужна только при запуске |
Жизненный цикл и команды
mvn compilemvn testmvn packagemvn cleanmvn clean installmvn clean package -DskipTestsmvn dependency:treeОсновные фазы: validate → compile → test → package → verify → install → deploy. Вызов фазы запускает все предыдущие.
После mvn package готовый архив лежит в target/demo-1.0.0.jar:
java -jar target/demo-1.0.0.jarЕсли зависимости нужно упаковать внутрь одного jar, используется maven-shade-plugin или maven-assembly-plugin.
Пример программы с зависимостью
src/main/java/com/example/Main.java:
package com.example;import com.google.gson.Gson;public class Main { record User(String name, int age) { } public static void main(String[] args) { Gson gson = new Gson(); String json = gson.toJson(new User("Анна", 25)); System.out.println(json); User back = gson.fromJson("{\"name\":\"Борис\",\"age\":30}", User.class); System.out.println(back); }}Запуск через Maven без упаковки можно сделать плагином exec:
mvn compile exec:java -Dexec.mainClass=com.example.MainGradle
Создание проекта
mkdir democd demogradle init --type java-application --dsl kotlinФайл build.gradle.kts
plugins { application}repositories { mavenCentral()}dependencies { implementation("com.google.code.gson:gson:2.11.0") testImplementation("org.junit.jupiter:junit-jupiter:5.11.0") testRuntimeOnly("org.junit.platform:junit-platform-launcher")}java { toolchain { languageVersion = JavaLanguageVersion.of(21) }}application { mainClass = "com.example.Main"}tasks.test { useJUnitPlatform()}Тот же файл на Groovy (build.gradle):
plugins { id 'application'}repositories { mavenCentral()}dependencies { implementation 'com.google.code.gson:gson:2.11.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher'}java { toolchain { languageVersion = JavaLanguageVersion.of(21) }}application { mainClass = 'com.example.Main'}test { useJUnitPlatform()}Конфигурации зависимостей
| Конфигурация | Назначение |
|---|---|
implementation | нужна для компиляции и запуска, не видна потребителям модуля |
api | как implementation, но видна потребителям (плагин java-library) |
compileOnly | только при компиляции |
runtimeOnly | только при запуске |
testImplementation | для тестов |
Команды
./gradlew build./gradlew test./gradlew run./gradlew clean./gradlew jar./gradlew dependencies./gradlew tasksВ Windows используйте gradlew.bat. Результат сборки находится в build/libs/.
settings.gradle.kts
rootProject.name = "demo"Структура проекта
И Maven, и Gradle ожидают одинаковую раскладку:
demo/├── pom.xml (или build.gradle.kts и settings.gradle.kts)├── src/│ ├── main/│ │ ├── java/│ │ └── resources/│ └── test/│ ├── java/│ └── resources/└── .gitignoreВ .gitignore стоит добавить:
target/build/.gradle/.idea/*.imlout/Многомодульные проекты
Для больших систем код делят на модули: например, core, api, app. В Maven это модули с родительским pom.xml, в Gradle — include("core", "api", "app") в settings.gradle.kts. Каждый модуль собирается отдельно и может зависеть от остальных.
Работа в IDE
- IntelliJ IDEA: откройте папку с
pom.xmlилиbuild.gradle.ktsкак проект. После изменения файла нажмите значок Reload All Maven (или Gradle) Projects. - Eclipse: Import → Existing Maven Projects. Для Gradle нужен плагин Buildship.
- VS Code: расширение Java Extension Pack поддерживает оба варианта. Дерево зависимостей показывается в разделе Java Projects.
Что выбрать
- Нужна простота и предсказуемость, много обучающих материалов: Maven.
- Нужна гибкость, скорость сборки, Android или Kotlin: Gradle.
- Присоединяетесь к существующему проекту: используйте то, что уже выбрано.
Типичные проблемы
Зависимость не скачивается. Проверьте сеть, прокси и правильность координат. Принудительное обновление: mvn -U clean install.
Не та версия Java. Проверьте java -version и mvn -version: Maven использует JAVA_HOME. Настройте maven.compiler.release или toolchain в Gradle.
Конфликт версий библиотек. Выведите дерево зависимостей: mvn dependency:tree или ./gradlew dependencies, затем явно зафиксируйте нужную версию.
IDE не видит новые зависимости. Перезагрузите проект в IDE.
