[英]Maven: pin dependency version where dependency is managed by a BOM
我們使用Maven BOM來管理一組庫的依賴關系。 BOM的dependencyManagement部分通常使用版本范圍來指定這些庫的版本,例如[2.0,2.1)
使用BOM的子pom.xml不為這些托管依賴項指定版本。 (為清楚起見,進行編輯:我們使用特定版本的第三方依賴項,范圍用於正在開發的內部庫,在這些庫中版本可以快速更改。我們定義版本范圍以確保這些庫之間的廣泛兼容性,即所有庫在同一庫中主要版本。)
(請注意,這不是一個多模塊項目。使用BOM表機制的庫和服務項目只是將其聲明為父項,並將其從Nexus存儲庫中拉出。它們不是一起構建的。)
我們也有一些使用version: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>
mvndependency 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的依賴項部分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中指定了范圍。 子poms中的樣板更多,但還不算太糟。
我們仍然可以定義屬性,以指定BOM表中子級可以使用的范圍,從而在必要時使所有范圍都變得容易一些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.