← Назад к вопросам
Что бы использовал в Maven для реализации зависимостей плагинов, при разделении монолита на микросервисы
2.0 Middle🔥 111 комментариев
#REST API и микросервисы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Что бы использовал в Maven для реализации зависимостей плагинов при разделении монолита на микросервисы
Краткий ответ
Для управления зависимостями при разделении монолита на микросервисы в Maven используется:
- Multi-Module Project (Parent POM) - единая иерархия проектов
- Bill of Materials (BOM) - централизованное управление версиями
- Private Repository (Artifactory/Nexus) - общие артефакты
- Plugin Management - единая версия плагинов
- Properties - едиными переменные для всех модулей
1. Multi-Module Maven Project (Parent POM)
Это основной подход для разделения монолита:
monolith/
├── pom.xml (Parent POM)
├── shared-lib/
│ └── pom.xml
├── user-service/
│ └── pom.xml
├── order-service/
│ └── pom.xml
├── payment-service/
│ └── pom.xml
└── notification-service/
└── pom.xml
Parent POM
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>microservices-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging> <!-- ВАЖНО: pom, не jar! -->
<name>Microservices Parent</name>
<!-- Подмодули -->
<modules>
<module>shared-lib</module>
<module>user-service</module>
<module>order-service</module>
<module>payment-service</module>
<module>notification-service</module>
</modules>
<!-- Свойства (переменные) для всех модулей -->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<spring-boot.version>3.1.0</spring-boot.version>
<spring-cloud.version>2022.0.3</spring-cloud.version>
<jackson.version>2.15.2</jackson.version>
</properties>
<!-- Управление версиями зависимостей (DependencyManagement) -->
<dependencyManagement>
<dependencies>
<!-- Spring Boot BOM -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud BOM -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Наши общие артефакты -->
<dependency>
<groupId>com.company</groupId>
<artifactId>shared-lib</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- Управление плагинами -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<argLine>-XX:+UseG1GC</argLine>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</project>
Child POM (например, user-service)
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<!-- Родитель -->
<parent>
<groupId>com.company</groupId>
<artifactId>microservices-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>user-service</artifactId>
<packaging>jar</packaging>
<name>User Service</name>
<!-- Зависимости (БЕЗ версий! - берут из dependencyManagement) -->
<dependencies>
<!-- Spring Boot (версия из parent) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Наша общая библиотека -->
<dependency>
<groupId>com.company</groupId>
<artifactId>shared-lib</artifactId>
</dependency>
<!-- Jackson (версия из parent) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- Тесты -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Плагины (БЕЗ версий!) -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. Bill of Materials (BOM)
Отдельный POM для управления версиями без иерархии:
<!-- bom-module/pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>microservices-bom</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.company</groupId>
<artifactId>shared-lib</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Использование BOM в другом проекте (без parent)
<!-- Какой-то другой проект, у которого уже есть свой parent -->
<project>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>
<groupId>com.company</groupId>
<artifactId>another-service</artifactId>
<!-- Импортируем BOM -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>microservices-bom</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>shared-lib</artifactId>
<!-- Версия берётся из BOM -->
</dependency>
</dependencies>
</project>
3. Shared Library (Общая библиотека)
Для кода, используемого во всех микросервисах:
shared-lib/
├── pom.xml
└── src/main/java/
├── com/company/shared/
│ ├── exception/
│ │ ├── ApiException.java
│ │ └── ErrorResponse.java
│ ├── dto/
│ │ ├── UserDto.java
│ │ └── OrderDto.java
│ ├── util/
│ │ ├── JwtUtils.java
│ │ └── DateUtils.java
│ └── config/
│ └── RestTemplateConfig.java
<!-- shared-lib/pom.xml -->
<project>
<parent>
<groupId>com.company</groupId>
<artifactId>microservices-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>shared-lib</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- JAR без Spring Boot wrapper -->
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
// com/company/shared/exception/ApiException.java
public class ApiException extends RuntimeException {
private final String errorCode;
public ApiException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public String getErrorCode() {
return errorCode;
}
}
// Используется во всех микросервисах
4. Private Repository (Artifactory/Nexus)
Для хранения общих артефактов:
<!-- parent-pom.xml -->
<repositories>
<repository>
<id>company-artifactory</id>
<url>https://artifactory.company.com/artifactory/libs-release</url>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>company-artifactory</id>
<url>https://artifactory.company.com/artifactory/libs-release</url>
</repository>
<snapshotRepository>
<id>company-artifactory</id>
<url>https://artifactory.company.com/artifactory/libs-snapshot</url>
</snapshotRepository>
</distributionManagement>
5. Plugin Management
Централизованное управление плагинами:
<!-- parent-pom.xml -->
<pluginManagement>
<plugins>
<!-- Компилятор -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
<release>17</release>
</configuration>
</plugin>
<!-- Spring Boot -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Docker -->
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<to>
<image>registry.company.com/${project.artifactId}:${project.version}</image>
</to>
</configuration>
</plugin>
<!-- Тесты -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<includes>
<include>**/*Test.java</include>
<include>**/*Tests.java</include>
</includes>
</configuration>
</plugin>
<!-- Code Coverage -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.10</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
6. Зависимость между микросервисами
// order-service/pom.xml
<dependencies>
<!-- Зависит от shared-lib -->
<dependency>
<groupId>com.company</groupId>
<artifactId>shared-lib</artifactId>
</dependency>
<!-- Может зависеть от другого микросервиса, если нужны DTOs -->
<dependency>
<groupId>com.company</groupId>
<artifactId>user-service-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
// user-service/pom.xml - экспортирует API DTOs
<module>user-service-api</module>
<module>user-service</module>
// user-service-api содержит только DTOs для использования другими сервисами
7. Пример структуры проекта
monolith/
├── pom.xml (Parent POM - main)
├── shared-lib/
│ ├── pom.xml
│ └── src/
├── user-service/
│ ├── user-service-api/
│ │ ├── pom.xml (API DTOs)
│ │ └── src/
│ └── user-service/
│ ├── pom.xml (Implementation)
│ └── src/
├── order-service/
│ ├── order-service-api/
│ │ ├── pom.xml (API DTOs)
│ │ └── src/
│ └── order-service/
│ ├── pom.xml (Implementation)
│ └── src/
├── payment-service/
│ ├── pom.xml
│ └── src/
└── notification-service/
├── pom.xml
└── src/
<!-- user-service/pom.xml -->
<modules>
<module>user-service-api</module>
<module>user-service</module>
</modules>
Лучшие практики
1. Используй dependencyManagement, не dependencies в parent
<!-- ПРАВИЛЬНО -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- НЕПРАВИЛЬНО -->
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
<!-- Это добавит зависимость ко ВСЕМ детям! -->
2. Экстернализуй версии
<properties>
<spring-boot.version>3.1.0</spring-boot.version>
<junit-jupiter.version>5.10.0</junit-jupiter.version>
</properties>
3. Используй релизы для стабильности
<version>1.0.0</version> <!-- Release -->
<!-- или -->
<version>1.0.0-SNAPSHOT</version> <!-- Development -->
Итоговый чеклист
- Parent POM с dependencyManagement и pluginManagement
- Multi-module структура (shared-lib, service-1, service-2)
- Общая библиотека для кода, используемого везде
- Private repository для артефактов
- Централизованное управление версиями (properties)
- Экспортируй только API модули, не имплементацию
- BOM для проектов без общего parent
Заключение для интервью
"При разделении монолита на микросервисы в Maven я использую:
- Parent POM со своей иерархией модулей
- dependencyManagement для централизованного управления версиями - это предотвращает конфликты версий
- Shared Library для кода, используемого везде (exceptions, DTOs, утилиты)
- pluginManagement для единых плагинов и конфигурации
- Private Repository (Nexus/Artifactory) для хранения общих артефактов
- API модули для экспорта public интерфейсов других сервисов
Это обеспечивает единую версионизацию, предотвращает конфликты версий и облегчает обслуживание множества микросервисов."