当前位置: 首页 > 知识库问答 >
问题:

Maven:为什么父pom中声明的依赖项不是由子pom继承的?

汤飞
2023-03-14

当我在父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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo</groupId>
    <artifactId>deps</artifactId>
    <packaging>pom</packaging>
    <version>0.0.1-SNAPSHOT</version>
<dependencyManagement>
        <dependencies>    
               <!-- not relevant for this question -->
        </dependencies>
    </dependencyManagement>
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.12</version>
        </dependency>
</dependencies>
</project>

上面我已经声明了spring-core作为父pom的依赖项
现在在child pom中,我正在导入父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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo</groupId>
    <artifactId>deps2</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.demo</groupId>
                <artifactId>deps</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
                           <!-- not relevant for this question -->

    </dependencies>
</project>

现在看看子pom继承的依赖项,没有。sping-corejar是否应该在所有情况下都由子项目继承。因为父pom直接依赖于此jar,并且它没有被子项目传递/继承。

注意:这个问题不是关于依赖关系管理和版本的
我理解dependencyManagement,它是为了确保一组项目具有相同的依赖关系版本和范围。

共有2个答案

叶光华
2023-03-14

您的子pom是一个独立的pom,因为您没有指定父级。您可以通过添加以下标签来定义父级:

<parent>
    <groupId>yourpackage</groupId>
    <artifactId>yourartifactid</artifactId>
    <version>version</version>
</parent>

在您的情况下,这个块应该可以做到:

<parent>
    <groupId>com.demo</groupId>
    <artifactId>deps</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

我知道你的问题不是关于依赖管理;但对于那些不知道区别的人,我会写一些关于这一点的话。

请注意,通过在

汤飞
2023-03-14

放置父标签和物料清单是有区别的(在依赖管理部分导入pom)

使用<代码>

另一方面,物料清单(在官方文档中称为物料清单)本身并不导入任何依赖项,但是它允许避免在应用程序的pom中指定依赖项的版本,因为您在该BOM中定义了它们。

因此,为了回答您的问题,您应该将儿童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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo</groupId>
    <artifactId>deps2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
       <groupId>com.demo</groupId>
       <artifactId>deps</artifactId>
       <version>0.0.1-SNAPSHOT</version>
    </parent>
    <dependencies>
                           <!-- not relevant for this question -->

    </dependencies>
</project>
 类似资料:
  • 我有一个maven工件(),它依赖于某个工件()。 有一个父pom,其中包含某些其他依赖项。 是否可以使用这些依赖项,而无需在其自身pom的依赖项部分中明确添加它们?

  • 我是使用maven和jenkins的新手。我正在尝试从父pom继承到子pom的依赖关系,它显示以下错误: 这是我的父母POM: 这是我的孩子波姆: 这是我如何尝试从父POM继承子POM中的依赖关系: 如果我在子POM中放置这些相同的依赖项,它会完美地工作。我使用jenkins在nexus中进行安装和部署。我使用的是maven-3.3.9。在jenkins中,我阅读了git中两个不同maven项目中

  • 在我的父pom xml文件中,我声明了一些在大多数孩子的pom中使用的依赖项。 然而,在一个子pom中,我不使用这些依赖项,我想找到一种方法来排除它们(为了不被视为未使用的依赖项)。 现在,在子pom的依赖部分,我什么都没有!有什么想法吗?

  • 我在父pom中有一个版本为2.3的Jackson,在我的子pom中我需要版本2.9,是否有任何方法排除父pom依赖?

  • 问题内容: 我是使用Maven和Jenkins的新手。我试图继承从父pom到子pom的依赖关系,它显示以下错误: 这是我的父母POM: 这是我的孩子POM: 这是我尝试从父POM继承子POM中的依赖项的方法: 如果我将相同的依赖项放在子POM中,则效果很好。我使用jenkins在nexus中进行安装和部署。我正在使用maven-3.3.9。在詹金斯,我从git中阅读了两个不同的Maven项目中的父

  • 我有一个带有子pom B、C和D的父pom A,在B、C和D中,我有相同类型的依赖项。 ie父Pom 儿童Pom 到目前为止,我已经尝试过编辑插件surefire,当试图排除子pom的测试范围时,它不起作用。 我的问题是,是否有一种方法可以将概要文件添加到父pom中,以排除所有子pom的类型测试jar的所有依赖项。谢谢