Статьи

Полный курс по языку Java — от установки JDK до многопоточности и HTTP-запросов

Maven и Gradle

Страница 27 из 30 · 2026-10-25 · 5 мин чтения

Зачем нужна система сборки

Вручную компилировать десятки файлов, скачивать библиотеки с их зависимостями, запускать тесты и упаковывать jar неудобно. Система сборки делает это одной командой и одинаково на любой машине.

Две основные системы:

MavenGradle
Конфигурация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 -version

Gradle

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=false

IDE тоже умеют создавать 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.Main

Gradle

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

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.