Maven:引脚依赖关系版本,其中依赖关系由BOM

时间:2017-10-19 23:09:38

标签: maven versions-maven-plugin maven-bom maven-versions-plugin

我们使用Maven BOM来管理一套库的依赖关系。 BOM的dependencyManagement部分通常使用版本范围来指定这些库的版本,例如[2.0,2.1)使用BOM的Child pom.xml不指定这些托管依赖项的版本。 (编辑说明:我们使用特定版本的第三方依赖项,范围用于正在进行开发的内部库,版本可以快速更改。我们定义版本范围以确保这些库之间的广泛兼容性,即所有库内的库主要版本。)

(请注意,这是多模块项目。使用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中?

这是一个人为的例子。

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">
    <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

mvn versions:resolve-ranges后的mytest pom.xml中的依赖关系部分:

<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>

因此,正如预期的那样解析了非托管依赖项。但管理的不是。我怎样才能解决它?

1 个答案:

答案 0 :(得分:0)

忘记这个问题!最后,我永远找不到找到基于范围的托管版本的方法。因此,我确实停止在BOM表中定义版本,而只是在每个子pom中指定了范围。子poms中有更多样板,但还不错。

我们仍然能够在BOM表中定义指定子级可以使用的范围的属性,从而在必要时使所有范围都变得容易一些。