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

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

卫俊力
2023-03-14

我正在使用Maven,我希望使用一些在dependencyManagement部分中有许多依赖项的工件作为父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>

假设这两个父POM都为某些依赖项定义了一个版本(假设jackson的版本),但每个都有不同的版本。

共有1个答案

慕容成和
2023-03-14

通常,Maven使用最接近的版本声明进行解析。

我的最佳猜测是,依赖项管理部分中的导入将是首选,因为它离使用依赖项的位置更近:

  • 依赖项->父pom中导入的依赖项=2跳
  • 依赖项->父pom->父pom中的依赖项管理=3跳
 类似资料:
  • 我在maven中学习了“导入”范围,并做了下面的一个示例项目, Project_1POM文件: 项目2 POM文件: 但是,这会引发一个错误,说明JUnit包在Project2中不可用。当我从POM文件中删除依赖管理标记project_1。一切工作正常。但是根据专家医生的说法, 此范围仅在节中pom类型的依赖项上受支持。它表示要用指定POM节中的有效依赖项列表替换的依赖项。由于它们被替换,具有导入

  • 项目A的pom是一个简单的pom: 项目B的pom: 在本例中,project B的spring-boot版本是2.0.3.release。 此作用域仅在区段中pom类型的依赖项上受支持。它指示要用指定POM区段中的有效依赖项列表替换的依赖项。由于它们被替换,具有导入范围的依赖项实际上并不参与限制依赖项的传递性。

  • 目前我的项目使用Spring启动测试如下: 但是,尽管有测试范围,它还是引入了sping-core(这是此版本中易受攻击的tpl)作为编译范围传递依赖项,并且它出现在我编译的二进制文件中。 我知道我可以通过使用测试范围显式拉动Spring核心来解决这个问题: 然而,这不应该是必要的。为什么只有在将依赖项拉入编译范围的测试中才有依赖项?

  • 理想情况下,在我的maven项目中,我只需要https://gist.github.com/kameshsampath/8a4bdc8b22d85bbe3f243fa1b816e464#file-src_main_build-l8-l9,尽管generate_workspace.bzl已经正确地解决了问题,如果我的src/main/build看起来像 但遗憾的是,这会导致大量编译错误,因为传递性D

  • maven允许您在pom文件中定义: (A) - (B) /- 如果我把错误/未知的工件放在A类-maven肯定会失败。 如果我将错误/未知工件放在类别B上-maven只会在它影响类别A时失败(例如,A在上定义dep,B在

  • 假设<code>B:1.0.1,但是子项目应该依赖于<code>A:1.2(有意覆盖传递依赖性)。 很容易发现 ,并从它的所有子POM中删除样板文件。不幸的是,下面的设置导致在最终的工件中使用两个版本:< code>A:1.0.1(作为< code>B:1.0.1的依赖项)和< code>A:1.0.2(来自父pom中的显式声明)。 如何在所有子项目中强制使用< code>A:1.0.2版本,并在