设置如下:
我正在使用Maven,我想在parentManagement部分中使用一些具有多个依赖项的工件作为父POM。但是我也想在我的POM中有一个dependencyManagement部分,因为我的工件将是其他一些子模块的父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>
<parent>
<groupId>com.mycompany</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0</version>
</parent>
<groupId>com.mycompany</groupId>
<artifactId>my-artifact</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>sub-module-01</module>
<module>sub-module-02</module>
</modules>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
假设两个父poms都为某些依赖项定义了一个版本(比如杰克逊的版本),但每个版本都有不同的版本。
当我在我的一个子模块中定义该依赖项时,将解析哪个版本?
我不确定如何在谷歌上搜索这种情况。
答案 0 :(得分:0)
让我们根据不同的情况: 首先,最简单的情况是任何pom的dependencyManagement部分中都没有pom依赖项导入标记,所有内容都很清楚,并且依赖项声明将对最接近的依赖项产生真正的影响,并且诸如exclude的属性将从父pom继承而exclusion与merge合并。
第二,如果每个pom的DM部分中都有直接声明,则此声明将用于此jar。如果不存在,则最接近的导入依赖项声明(如果存在)将用于jar / pom的版本。在这里,最接近的均值是到pom和super pom或super super pom的距离。但不是传递距离!
答案 1 :(得分:-1)
我认为它将是导入的版本。因为进口 DependencyManagement只需替换依赖项即可。因此,父依赖项将被导入依赖项覆盖。我不验证这一点。只是一个猜测。
我只是做一个实验来检查这种情况。 首先。我定义了netty-handler的依赖项。 在我的Maven资源库中,netty-handler版本包含:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
<version>4.1.8.Final</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
<version>4.1.9.Final</version>
</dependency>
我在pom.xml中创建一个带有此内容的test_parent pom项目
<groupId>dm-test</groupId>
<artifactId>parent-test-pom</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<!-- define a dependency in super parent pom with version 4.1.8.Final -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
<version>4.1.8.Final</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
,然后创建一个pom项目进行导入:
<groupId>dm-test</groupId>
<artifactId>import-pom</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<!-- define a dependency in super parent pom with version 4.1.9.Final -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
<version>4.1.9.Final</version>
</dependency>
</dependencies>
</dependencyManagement>
最后,我用parent_pom和import_pom创建一个战争项目,如下所示:
<groupId>dm-test</groupId>
<artifactId>test-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
<groupId>dm-test</groupId>
<artifactId>parent-test-pom</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>dm-test</groupId>
<artifactId>import-pom</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
</dependency>
</dependencies>
最后,我们可以看到依赖项jar版本是 4.1.8.Final