Maven - 父级和导入范围中的依赖关系管理

时间:2015-05-03 09:27:20

标签: java maven

设置如下:

我正在使用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都为某些依赖项定义了一个版本(比如杰克逊的版本),但每个版本都有不同的版本。

当我在我的一个子模块中定义该依赖项时,将解析哪个版本?

我不确定如何在谷歌上搜索这种情况。

2 个答案:

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

所以,我的猜测是错误的。对于那个很抱歉。 enter image description here