Maven:固定依赖版本,其中依赖由 BOM 管理
Maven: pin dependency version where dependency is managed by a BOM
我们使用 Maven BOM 来管理一套库的依赖关系。 BOM 的 dependencyManagement 部分通常使用版本范围来指定这些库的版本,例如,[2.0,2.1)
Child pom.xml 使用 BOM 不指定这些托管依赖项的版本。 (编辑澄清:我们为第三方依赖项使用特定版本,范围用于正在开发的内部库,其中版本可以快速更改。我们定义版本范围以确保这些库之间的广泛兼容性,即所有在同一个主要版本。)
(请注意,这 不是 一个多模块项目。使用 BOM 机制的库和服务项目只是将其声明为父级并从 Nexus 存储库中提取它。他们不是一起建造的。)
我们还有一些构建系统脚本使用 versions:resolve-ranges 来固定出现在我们的库和服务 pom.xml(不是 BOM 的 pom.xml)中的依赖项版本。这些具有已解析范围的 pom.xml 已签入源代码管理并进行标记,因此如果我们需要将部署回滚到较早的版本,我们可以使用标记为 pom.xml 的构建使用与原始构建相同的依赖版本,即使更新版本的依赖现在可用(因此 resolve-ranges
如果我们重新运行它会提供更新的版本)。
我刚刚注意到这两种机制不能很好地协同工作。库或服务 pom.xml 上的 运行 versions:resolve-ranges
仅解析 pom.xml 中的范围。依赖管理下的版本仍未指定,因此如果我们使用此 pom.xml 进行新构建,我们将在构建时获得范围内的最新依赖版本。不是我们想要的!
有没有办法使用 versions:resolve-ranges
(或任何其他插件或技术)来解析托管版本并将它们粘贴到子 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.maventest</groupId>
<artifactId>myproject</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>myproject</name>
<url>http://maven.apache.org</url>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>[2.0, 2.3]</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
使用 BOM 的子项目(一个托管依赖项,一个非托管依赖项):
<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/maven-v4_0_0.xsd">
<parent>
<groupId>com.maventest</groupId>
<artifactId>myproject</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../myproject/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.maventest</groupId>
<artifactId>mytest</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>mytest</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>[3.8, 3.9)</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
来自 mvn dependency:tree
的片段显示了依赖项的有效版本:
[INFO] com.maventest:mytest:jar:1.0-SNAPSHOT
[INFO] +- commons-lang:commons-lang:jar:2.3:compile
[INFO] \- junit:junit:jar:3.8.2-brew:test
mytest pom.xml mvn versions:resolve-ranges
之后的依赖部分:
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2-brew</version>
<scope>test</scope>
</dependency>
</dependencies>
因此,如预期的那样解决了非托管依赖项。但是托管的不是。我怎样才能让它也得到解决?
忘记这个问题了!最后,我永远找不到一种方法来固定基于范围的托管版本。所以我确实停止了在 BOM 中定义版本,只是在每个子 pom 中指定了范围。子 pom 中有更多样板,但还不错。
我们仍然能够定义指定 BOM 中儿童可以使用的范围的属性,从而在必要时更容易地碰撞所有范围。
我们使用 Maven BOM 来管理一套库的依赖关系。 BOM 的 dependencyManagement 部分通常使用版本范围来指定这些库的版本,例如,[2.0,2.1)
Child pom.xml 使用 BOM 不指定这些托管依赖项的版本。 (编辑澄清:我们为第三方依赖项使用特定版本,范围用于正在开发的内部库,其中版本可以快速更改。我们定义版本范围以确保这些库之间的广泛兼容性,即所有在同一个主要版本。)
(请注意,这 不是 一个多模块项目。使用 BOM 机制的库和服务项目只是将其声明为父级并从 Nexus 存储库中提取它。他们不是一起建造的。)
我们还有一些构建系统脚本使用 versions:resolve-ranges 来固定出现在我们的库和服务 pom.xml(不是 BOM 的 pom.xml)中的依赖项版本。这些具有已解析范围的 pom.xml 已签入源代码管理并进行标记,因此如果我们需要将部署回滚到较早的版本,我们可以使用标记为 pom.xml 的构建使用与原始构建相同的依赖版本,即使更新版本的依赖现在可用(因此 resolve-ranges
如果我们重新运行它会提供更新的版本)。
我刚刚注意到这两种机制不能很好地协同工作。库或服务 pom.xml 上的 运行 versions:resolve-ranges
仅解析 pom.xml 中的范围。依赖管理下的版本仍未指定,因此如果我们使用此 pom.xml 进行新构建,我们将在构建时获得范围内的最新依赖版本。不是我们想要的!
有没有办法使用 versions:resolve-ranges
(或任何其他插件或技术)来解析托管版本并将它们粘贴到子 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.maventest</groupId>
<artifactId>myproject</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>myproject</name>
<url>http://maven.apache.org</url>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>[2.0, 2.3]</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
使用 BOM 的子项目(一个托管依赖项,一个非托管依赖项):
<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/maven-v4_0_0.xsd">
<parent>
<groupId>com.maventest</groupId>
<artifactId>myproject</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../myproject/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.maventest</groupId>
<artifactId>mytest</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>mytest</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>[3.8, 3.9)</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
来自 mvn dependency:tree
的片段显示了依赖项的有效版本:
[INFO] com.maventest:mytest:jar:1.0-SNAPSHOT
[INFO] +- commons-lang:commons-lang:jar:2.3:compile
[INFO] \- junit:junit:jar:3.8.2-brew:test
mytest pom.xml mvn versions:resolve-ranges
之后的依赖部分:
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2-brew</version>
<scope>test</scope>
</dependency>
</dependencies>
因此,如预期的那样解决了非托管依赖项。但是托管的不是。我怎样才能让它也得到解决?
忘记这个问题了!最后,我永远找不到一种方法来固定基于范围的托管版本。所以我确实停止了在 BOM 中定义版本,只是在每个子 pom 中指定了范围。子 pom 中有更多样板,但还不错。
我们仍然能够定义指定 BOM 中儿童可以使用的范围的属性,从而在必要时更容易地碰撞所有范围。