Поддержка двух разных версий Spring boot в одном пакете Maven

Допустим, у нас есть пакет shared-lib. Pom для этого же следующим образом:

<project  
xsi_schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.project.microservice-a</groupId>
<artifactId>shared-lib</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>shared-lib</name>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <start-class>com.projects.lib1.Application</start-class>
    <java.version>1.8</java.version>
</properties>
....
....
</project>

Есть проекты, использующие общую библиотеку выше, имеющие следующий pom.XML

<project  
xsi_schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.projects.microservice</groupId>
<artifactId>accounts</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>accounts</name>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.3.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
    <dependencies>
    <dependency>
        <groupId>com.project.microservice-a</groupId>
        <artifactId>shared-lib</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
....
<dependencies>

Тогда есть одна специальная подсистема, работающая на Spring-boot-starter-parent.1.3.5 в качестве родителя, который не будет принимать общий lib с Spring-boot-starter-parent-1.2.3.

Для импорта shared-lib с Spring-boot.1.3.5, нам нужно модифицировать pom.xml с родительской версией Spring 1.3.5, а затем сборка. Это вызывает проблемы с обслуживанием при построении всех подсистем, так как Jenkins CI строит все JAR-файлы из Github с главной ветвью. Мы можем указать отдельную ветвь вручную, но сохранение одного и того же кода для двух ветвей является простым повторением.

Может ли кто-нибудь предложить решение, которое IMO может быть способом достижения одного из этих:

  1. Создайте пакет, встраивающий Spring 1.2.3 и Spring 1.3.5 и задающий требуемую версию зависимостей в других подсистемах.

  2. Bulid оригинальный клиентский пакет с Spring Boot 1.3.5, и заставить его использовать более старую версию Spring boot при использовании зависимости в необходимых подсистемах.

1 ответ

  1. Допустим, это ваши зависимости для каждого проекта:

    1. shared-lib:
      • spring-boot-foo: 1.2.3
    2. проект-а:
      • shared-lib
      • spring-boot-bar: 1.2.3
    3. Проект-Б:
      • shared-lib
      • spring-boot-baz: 1.3.5

    Теперь вы хотите, чтобы project-a использовал 1.2.3 всех библиотек spring-boot, а project-b-1.3.5, независимо от того, какие общие библиотеки spring-boot-lib указывает?

    Поместите следующее в pom.XML:

    <properties>
        <spring-boot.version>1.3.5.RELEASE</spring-boot.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    Если ваши проекты имеют общий родительский pom.xml, вы можете поместить его туда и просто изменить spring-boot.versionзначение на что-то другое для каждого проекта, как вы считаете нужным. В противном случае вам придется дублировать его.

    В качестве альтернативы, если так называемая BOM (<scope>import</scope>) не работает, вы можете перечислить каждую зависимость явно, например:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-foo</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-bar</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-baz</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    Подробнее об управлении зависимостями spring-boot: http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-build-systems.html

    ОБНОВЛЕНИЕ:

    Вы можете управлять другими зависимостями так же, как это необходимо. Например:

    <properties>
        <spring-data-releasetrain.version>Gosling-SR4</spring-data-releasetrain.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-releasetrain</artifactId>
                <version>${spring-data-releasetrain.version}</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>