Что такое многомодульный проект в Maven и каковы его преимущества?

«Что такое многомодульный проект в Maven и каковы его преимущества?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Многомодульный проект в Maven — это структура, где один родительский проект (POM) объединяет несколько дочерних модулей. Это позволяет организовать код в логические блоки с четко определенными зависимостями.

Основные преимущества:

  • Упрощение сборки: Общие команды (mvn clean install) выполняются для всех модулей сразу.
  • Изоляция и переиспользование: Модули могут быть независимо скомпилированы, протестированы и использованы как зависимости.
  • Управление зависимостями: Четкая иерархия и централизованное объявление версий зависимостей в родительском POM.
  • Структурирование: Идеально подходит для разделения на слои приложения (например, core, api, service, web).

Пример структуры проекта:

parent-project/
├── pom.xml (родительский, packaging = pom)
├── core-module/
│   └── pom.xml
└── web-module/
    └── pom.xml

Ключевые элементы родительского pom.xml:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>core-module</module>
        <module>web-module</module>
    </modules>

    <!-- Общие зависимости и плагины для всех модулей -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>3.1.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

Зависимость между модулями (в pom.xml модуля web-module):

<dependency>
    <groupId>com.example</groupId>
    <artifactId>core-module</artifactId>
    <version>${project.version}</version>
</dependency>