Skip to content

Maven POM 文件的继承关系 #18

@bitfishxyz

Description

@bitfishxyz

Maven POM 文件的继承关系

Maven允许一个pom文件继承自另一个pom文件,它们之间有如下的关系:

  1. 父POM的dependencies会被子模块全盘继承。

    相当于在子模块中复制粘贴了一份。
    如果子模块中重新定义了相同GAV(groupId + artifactId + version) 的依赖,那么子模块的版本号会覆盖父模块的。

  2. <dependencyManagement>

    子模块想继承父模块这里面的依赖,需要声明GA,然后就可以继承父模块的版本号了。

    这样做的意义是避免依赖冲突。比如SpringBoot 父POM中定义近千个依赖,它们是经过Spring官方团队充分测试的,不会出现依赖冲突。

实例

这是一个父子项目的实例,父POM定义在./ParentPOM这个文件夹。

这个是父POM:

20190511153354

在这个项目中,我们的父pom在dependencies中定义了3个模块,在dependencyManagement中定义了2个模块,接下来我们就看看子pom继承后会发生什么情况。

这个是子POM:

hello 2019-05-11 at 3.15.27 PM

IDEA中,External Libraries显示的就是项目根目录下的pom(也就是子pom)所具有的依赖关系。我们可以通过IDEA的智能提醒来方便的看到:

  1. 子模块直接继承了父模块的fastjson 和 lombok这两个依赖,版本号也是完全继承了。
  2. junit也继承了,但是子模块中重新定义了Junit的版本号,所以父模块的版本号被覆盖了
  3. unirest被父模块定义在<dependencyManagement>,所以子模块没有能够继承
  4. 但是子模块可以通过定义GA继承父模块<dependencyManagement>中依赖的版本号。我们子模块的okhttp没有写版本号但是依旧能过正常运行因为它从父模块中继承了版本号。

上面就是几种场景的说明。这里是源代码,你可以自己测试下。

https://github.com/fish-java/MavenPomInheritance

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions