Управление многомодульными проектами Maven

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

Преимущества многомодульных проектов

  1. Повторное использование кода: Общий код можно выделить в отдельный модуль для использования другими модулями
  2. Разделение ответственности: Разные команды могут сосредоточиться на разработке разных модулей
  3. Эффективность сборки: Собираются только изменённые модули, что сокращает время сборки
  4. Управление зависимостями: Централизованное управление зависимостями всех модулей
  5. Управление версиями: Все модули используют единый номер версии для упрощения управления

Применимые сценарии

  • Разделение крупных проектов на слои (например,web、service、dao)

  • Микросервисная архитектура (один модуль на сервис)

  • Совместное использование общего кода (например,commonМодуль)

Стандартная структура каталогов

parent-project/          # 父项目根目录
├── pom.xml             # 父POM(packaging=pom)
├── module-a/           # 子模块A
│   ├── src/
│   └── pom.xml         # 子模块A的POM
├── module-b/           # 子模块B
│   ├── src/
│   └── pom.xml         # 子模块B的POM
└── module-web/         # Web模块
    ├── src/
    └── pom.xml

Ключевые особенности:

  1. Родительский POM:

    • Необходимо установить<packaging>pom</packaging>

    • через<modules>Управление подмодулями

  2. Подмодули:

    • через<parent>наследуют родительский POM

    • могут иметь собственные зависимости и конфигурации сборки


Создание многомодульного проекта Maven

1. Создайте родительский проект

Сам родительский проект обычно не содержит никакого кода; он в основном используется для управления подмодулями и общей конфигурацией.

Чтобы создать файл pom.xml родительского проекта, необходимо установить packaging в pom:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
   
    <modules>
        <module>module1</module>
        <module>module2</module>
    </modules>
</project>

2. Создание подмодулей

Подмодули — это реальные модули кода, которые могут быть обычными Java-проектами, веб-приложениями и т. д. У каждого подмодуля есть собственный файл pom.xml, но он должен объявлять родительский проект:

<project>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
    </parent>
   
    <modelVersion>4.0.0</modelVersion>
    <artifactId>module1</artifactId>
</project>

Управление зависимостями в многомодульных проектах

В многомодульном проекте модули могут зависеть друг от друга. Например, module2 зависит от module1:

<project>
    <!-- pom.xml модуля module2 -->
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>module1</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>

Наследование зависимостей

Родительский проект может определять общие зависимости, и подмодули будут автоматически наследовать эти зависимости:

<project>
    <!-- pom.xml родительского проекта -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

Подмодулю достаточно объявить groupId и artifactId зависимости, не указывая версию:

<project>
    <!-- pom.xml подмодуля -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
</project>

Сборка многомодульных проектов

1. Собрать весь проект

Выполните следующее в родительском каталоге проекта:

mvn clean install

Это соберёт все подмодули в порядке зависимостей.

2. Собрать отдельный модуль

Перейдите в каталог нужного модуля и выполните:

cd module1
mvn clean install

Или укажите модуль из родительского каталога проекта:

mvn -pl module1 clean install

3. Собрать модуль и его зависимости

mvn -pl module1 -am clean install

Лучшие практики для многомодульных проектов

1. Разумное разделение на модули

  • Разделите модули по функциям
  • Разделите модули по слоям (например, dao, service, web)
  • Вынесите общие утилиты в отдельный модуль

2. Управление версиями

  • Используйте родительский проект для централизованного управления номерами версий
  • Рассмотрите использование плагина versions Maven для управления обновлениями версий

3. Оптимизация сборки

  • Настройте подходящий порядок сборки
  • Используйте профили для управления сборками для разных сред
  • Рассмотрите параллельные сборки для повышения эффективности

4. Управление зависимостями

  • Централизованно управляйте общими зависимостями в родительском проекте
  • Используйте dependencyManagement для унификации версий
  • Избегайте циклических зависимостей

Распространённые проблемы и решения

1. Проблемы циклических зависимостей

Проблема: Модуль A зависит от модуля B, а модуль B зависит от модуля A.
Решение:

  • Переработайте структуру модулей и вынесите общий код в третий модуль
  • Используйте интерфейсы для развязки

2. Проблемы порядка сборки

Проблема: Maven не может корректно определить порядок зависимостей между модулями.
Решение:

  • Явно объявляйте зависимости модулей
  • Используйте плагин reactor для анализа порядка сборки

3. Проблемы несогласованности версий

Проблема: Разные модули используют разные версии зависимостей.
Решение:

  • Централизованное управление версиями зависимостей в родительском проекте
  • Используйте dependencyManagement

За счёт разумного использования управления многомодульными проектами Maven можно значительно повысить удобство сопровождения и эффективность сборки крупных проектов. Освоение этих приёмов поможет вам лучше организовывать и управлять сложными Java-проектами.

Другие расширения