← Назад к вопросам

Что бы использовал в Maven для реализации зависимостей плагинов, при разделении монолита на микросервисы

2.0 Middle🔥 111 комментариев
#REST API и микросервисы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Что бы использовал в Maven для реализации зависимостей плагинов при разделении монолита на микросервисы

Краткий ответ

Для управления зависимостями при разделении монолита на микросервисы в Maven используется:

  1. Multi-Module Project (Parent POM) - единая иерархия проектов
  2. Bill of Materials (BOM) - централизованное управление версиями
  3. Private Repository (Artifactory/Nexus) - общие артефакты
  4. Plugin Management - единая версия плагинов
  5. 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 -->

Итоговый чеклист

  1. Parent POM с dependencyManagement и pluginManagement
  2. Multi-module структура (shared-lib, service-1, service-2)
  3. Общая библиотека для кода, используемого везде
  4. Private repository для артефактов
  5. Централизованное управление версиями (properties)
  6. Экспортируй только API модули, не имплементацию
  7. BOM для проектов без общего parent

Заключение для интервью

"При разделении монолита на микросервисы в Maven я использую:

  1. Parent POM со своей иерархией модулей
  2. dependencyManagement для централизованного управления версиями - это предотвращает конфликты версий
  3. Shared Library для кода, используемого везде (exceptions, DTOs, утилиты)
  4. pluginManagement для единых плагинов и конфигурации
  5. Private Repository (Nexus/Artifactory) для хранения общих артефактов
  6. API модули для экспорта public интерфейсов других сервисов

Это обеспечивает единую версионизацию, предотвращает конфликты версий и облегчает обслуживание множества микросервисов."

Что бы использовал в Maven для реализации зависимостей плагинов, при разделении монолита на микросервисы | PrepBro