Многомодульные проекты
Тема дорожной карты · Java
Многомодульные проекты Maven/Gradle позволяют разбивать крупные Java-кодовые базы на независимо версионированные модули с общим жизненным циклом сборки, являясь стандартным подходом для структур монорепозитория и корпоративных приложений. В Maven родительский pom.xml объявляет секцию <modules>, перечисляющую дочерние модули, такие как api, service и web, тогда как каждый дочерний модуль наследует версии зависимостей из <dependencyManagement> родителя, обеспечивая единообразие во всём проекте. Gradle достигает той же цели через корневой settings.gradle с include ':api', ':service', ':web' и конвенциональный build.gradle в корне, применяющий общие плагины и версии через блоки subprojects {}; Gradle Version Catalog (libs.versions.toml) дополнительно централизует координаты зависимостей. Оба инструмента разрешают межмодульные зависимости вроде implementation(project(':service')), обеспечивая инкрементальную компиляцию — перестраиваются только изменённые модули и их зависимые, что значительно сокращает время CI-сборки крупных кодовых баз. Фреймворки вроде Spring Boot активно используют многомодульные компоновки: spring-boot-autoconfigure, spring-boot-starter-* и модули приложений публикуются как отдельные Maven-артефакты, транзитивно потребляемые.
Как это работает
Многомодульные проекты — это Maven (самый популярный, XML-based pom.xml) или Gradle (Groovy/Kotlin DSL, быстрее, гибче). Оба управляют зависимостями (Maven Central — канонический репо), компилируют, гонят тесты, пакетируют JAR / WAR, публикуют в репо. Wrapper-скрипты (mvnw, gradlew) обеспечивают использование запинненной версии. Multi-module проекты + Bill of Materials (BOM) — для выравнивания версий между модулями.
Когда применять
Maven — если команда ценит конвенцию + стабильность; Gradle — для больших multi-module сборок, где Maven медленный. Всегда wrapper (mvnw / gradlew); не полагайтесь на глобальный Maven/Gradle. Пиннинг версий; dependency-check / OWASP-плагин — для выявления CVE. mvn dependency:tree / gradle dependencies периодически — для замечания дрейфа версий.
Типичные ошибки
Ловушки Многомодульные проекты: SNAPSHOT-зависимости в production (невоспроизводимые сборки); не закоммичен wrapper (mvnw/gradlew) — новые инженеры видят несовпадение версий; transitive-конфликты (mvn dependency:tree показывает); долгие Gradle-сборки без configuration cache + build cache (gradle 7+).