在单个Maven包中维护两个不同的Spring启动版本

时间:2016-05-27 11:42:23

标签: java spring maven spring-mvc spring-boot

假设我们有一个共享lib包。同样的pom如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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上运行一个特殊的子系统作为父系统,它不会使用Spring-boot-starter-parent-1.2.3的shared-lib。

为了使用Spring-boot.1.3.5导入shared-lib,我们需要使用parent修改pom.xml作为Spring 1.3.5版本然后构建。这会在构建所有子系统时导致维护问题,因为Jenkins CI使用master分支从Github构建所有JAR。我们可以手动指定一个单独的分支,但是为两个分支维护相同的代码是明确的重复。

任何人都可以建议一个解决方案,IMO可能是实现其中之一的方法:

  1. 创建一个嵌入Spring 1.2.3和Spring 1.3.5的包,并在其他子系统中指定所需的依赖版本。

  2. 使用Spring Boot 1.3.5构建原始客户端软件包,并在所需子系统中使用依赖项时强制它使用旧版本的Spring引导。

1 个答案:

答案 0 :(得分:0)

假设这些是您对每个项目的依赖关系:

  1. 共享-lib的:
    • 弹簧引导FOO:1.2.3
  2. 项目-A:
    • 共享-lib的
    • spring-boot-bar:1.2.3
  3. 项目-B:
    • 共享-lib的
    • 弹簧引导巴兹:1.3.5
  4. 现在你想要project-a使用所有spring-boot库的1.2.3,而project-b使用1.3.5,不管shared-lib指定的spring-boot库是什么?

    将以下内容放入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>