- Узнавать стандартную структуру папок проекта Maven/Gradle
- Добавлять зависимость по координатам (
groupId:artifactId:version) с правильной областью (scope) - Запускать фазы жизненного цикла Maven и задачи Gradle
До сих пор каждая программа была одним файлом Main.java, который запускался командой java Main.java. В настоящем проекте — сотни классов, десятки внешних библиотек (JSON, драйвер базы данных, фреймворк для тестов) и несколько разработчиков. Скачивать каждый JAR-файл вручную и передавать javac длинный список -cp быстро становится кошмаром. Эту работу выполняют системы сборки (build tools): Maven и Gradle сами скачивают библиотеки, компилируют код, запускают тесты и упаковывают готовый JAR-файл.
Стандартная структура проекта
Maven следует принципу «соглашения важнее конфигурации» (convention over configuration): файлы всегда лежат в одних и тех же местах, поэтому не нужно объяснять инструменту, где их искать. Gradle использует ту же структуру. Основной код находится в src/main/java, тесты — в src/test/java, а файлы настроек и изображения — в src/main/resources. Имя пакета превращается в папки: пакет com.educora — это папка com/educora. Результат сборки попадает в target/ у Maven и в build/ у Gradle.
grade-book/
├── pom.xml ← Maven (Gradle: build.gradle.kts)
├── src/
│ ├── main/
│ │ ├── java/com/educora/App.java
│ │ └── resources/config.properties
│ └── test/
│ └── java/com/educora/AppTest.java
└── target/ ← build output (Gradle: build/)Внешняя библиотека, без которой проект не работает. Её определяют три координаты: groupId (организация, например com.google.code.gson), artifactId (имя библиотеки, gson) и version (2.11.0). Краткая запись: com.google.code.gson:gson:2.11.0. Инструмент скачивает библиотеку из репозитория Maven Central и хранит её в кэше на компьютере.
Maven и pom.xml
Сердце проекта Maven — файл **pom.xml (Project Object Model). В нём записаны координаты самого проекта, версия Java и список зависимостей. В файле ниже две зависимости: Gson для работы с JSON и JUnit для тестов. Библиотеки, которые нужны им самим, — транзитивные зависимости** — Maven скачивает автоматически.
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.educora</groupId>
<artifactId>grade-book</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>
</project>pom.xml: maven.compiler.release задаёт компиляцию под Java 21Обрати внимание на строку <scope>test</scope>: JUnit нужен только в тестах и не должен попасть в готовую программу. Область (scope) определяет, где можно использовать зависимость:
| Scope | Где видна | Пример |
|---|---|---|
compile | везде: основной код, тесты и работающая программа (по умолчанию) | Gson |
test | только в src/test/java | JUnit, Mockito |
provided | при компиляции; во время работы её даёт сервер | Servlet API |
runtime | только во время работы, не при компиляции | драйвер JDBC |
Жизненный цикл Maven
В Maven команды — это фазы жизненного цикла, которые идут в строгом порядке. Вызывая фазу, Maven выполняет и все фазы перед ней: mvn package сначала проверяет проект, компилирует его и запускает тесты, и только потом создаёт JAR. Если хоть один тест упал, сборка останавливается — код с ошибкой не упаковывается. clean — отдельная фаза: она удаляет старую папку target/.
| Фаза | Что делает |
|---|---|
validate | проверяет корректность проекта |
compile | компилирует src/main/java в target/classes |
test | запускает тесты из src/test/java |
package | создаёт JAR- (или WAR-) файл |
verify | выполняет дополнительные проверки, например интеграционные тесты |
install | кладёт JAR в локальный репозиторий (~/.m2) |
deploy | отправляет JAR в удалённый репозиторий команды |
mvn clean package[INFO] Scanning for projects... [INFO] Building grade-book 1.0.0 [INFO] --- compiler:3.13.0:compile (default-compile) @ grade-book --- [INFO] --- surefire:3.2.5:test (default-test) @ grade-book --- [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 [INFO] --- jar:3.4.1:jar (default-jar) @ grade-book --- [INFO] Building jar: C:\projects\grade-book\target\grade-book-1.0.0.jar [INFO] BUILD SUCCESS
Gradle и build.gradle.kts
Gradle делает ту же работу, но вместо XML использует скрипт, похожий на программный код. В современных проектах скрипт пишут на Kotlin — build.gradle.kts (в старых проектах встретится и build.gradle на Groovy). Вместо фаз у Gradle задачи (tasks): compileJava, test, jar, build. Gradle не пересобирает то, что не изменилось, и кэширует результаты, поэтому в больших проектах он обычно быстрее Maven. Android-приложения тоже собираются с помощью Gradle.
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.educora.App"
}
tasks.test { useJUnitPlatform() }build.gradle.kts: implementation соответствует области compile в Maven, а testImplementation — области testПлагин application добавляет задачу ./gradlew run: она запускает класс из mainClass вместе со всеми библиотеками. Блок toolchain велит Gradle собирать проект именно на Java 21. Сравни ручную сборку и Gradle:
# download every JAR by hand into lib/, then:
javac -d out -cp lib/gson-2.11.0.jar src/com/educora/*.java
java -cp "out:lib/gson-2.11.0.jar" com.educora.App
# a new library? download it, fix both commands again...# dependencies are listed once in build.gradle.kts
./gradlew build # download, compile, test, package
./gradlew run # start the app with all its libraries| Действие | Maven | Gradle |
|---|---|---|
| Компиляция | mvn compile | ./gradlew compileJava |
| Запуск тестов | mvn test | ./gradlew test |
| Сборка JAR | mvn package | ./gradlew build |
| Удаление результатов сборки | mvn clean | ./gradlew clean |
| Дерево зависимостей | mvn dependency:tree | ./gradlew dependencies |
Создай проект шаг за шагом
- 1Проверь JDK
Набери в терминале
java -version: версия должна быть 21 или новее. - 2Создай проект
В IntelliJ IDEA выбери
File › New › Project: язык Java, Build system — Maven или Gradle, JDK 21. Впишиcom.educoraв полеGroupIdиgrade-bookв полеArtifactId. В терминале то же самое делает командаgradle init. - 3Добавь зависимость
Найди координаты библиотеки на сайте Maven Central и впиши их в
pom.xmlилиbuild.gradle.kts. Затем нажми Reload в панели Maven/Gradle в IDE, чтобы библиотека скачалась. - 4Собери и запусти
mvn packageили./gradlew buildзапустит тесты и создаст JAR; в Gradle./gradlew runсразу запускает программу. Готовый JAR окажется вtarget/илиbuild/libs/.
Главное
- Maven и Gradle скачивают библиотеки, компилируют код, запускают тесты и собирают JAR.
- Стандартная структура:
src/main/java,src/main/resources,src/test/java; результат — вtarget/илиbuild/. - Зависимость записывается координатами
groupId:artifactId:version; её область (scope) определяет, где она видна. - При вызове фазы Maven выполняются и все предыдущие:
package=validate→compile→test→package. - В Gradle пишут
implementation/testImplementation; wrapper (./gradlew,./mvnw) даёт всем одну и ту же версию.
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.