假设我们有一个共享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可能是实现其中之一的方法:
创建一个嵌入Spring 1.2.3和Spring 1.3.5的包,并在其他子系统中指定所需的依赖版本。
使用Spring Boot 1.3.5构建原始客户端软件包,并在所需子系统中使用依赖项时强制它使用旧版本的Spring引导。
答案 0 :(得分:0)
假设这些是您对每个项目的依赖关系:
现在你想要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>