1、概念:

        Maven工程之间,A工程继承B工程

  •      B工程:父工程
  •      A工程:子工程

        本质上是A工程的 pom.xml 中的配置继承了B工程中pom.xml 的配置。

2、作用:

(依赖的信息可以统一在父工程中进行抽取和统一管理,比如说有F这个父工程,A、B、C、D、E这几个子工程,里面都用到了同一个框架spring,那么就要保证统一用到的spring框架版本是相同的版本,甚至说需要统一修改版本的时候也可以在父工程中进行统一的修改,实现一处修改处处生效的效果,那么我们就把版本号放在父工程中进行统一的修改和管理。具体来说,继承主要就是管理我们项目中使用的依赖信息的版本version)

        在父工程中统—管理项目中的依赖信息,具体来说是管理依赖信息的版本。
        它的背景是:

  •     对一个比较大型的项目进行了模块拆分。
  •     一个project 下面,创建了很多个module。
  •     每一个module都需要配置自己的依赖信息。

它背后的需求是:

  • 在每一个module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
  • 使用同一个框架内的不同jar包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。
  • 使用框架时所需要的jar包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的jar包;又能够将以往的经验沉淀下来,节约时间和精力。

3、举例

maven 多级模块 单独编译子模块报错 maven子模块版本继承_xml文件

        比如使用Spring时要求所有Spring自己的jar包版本必须一致。为了能够对这些jar包的版本进行统一管理,我们使用继承这个机制,将所有版本信息统一在父工程中进行管理。

4、操作

        4.1创建父工程

                创建过程和前面的文章提到的使用命令行窗口进行Maven版的java工程创建一样

                工程名称:pro03-maven-parent

maven 多级模块 单独编译子模块报错 maven子模块版本继承_jar包_02

                父工程创建好之后要打开父工程的pom.xml文件修改父工程的打包方式

                (这里一定要改,否则在下面创建子工程时会报错:

                [ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.2.1:generate (default-cli) on project pro03-maven-parent: Unable to add module to the current project as it is not of packaging type 'pom')

maven 多级模块 单独编译子模块报错 maven子模块版本继承_xml文件_03

父工程中的依赖就没有用了,可以删掉

maven 多级模块 单独编译子模块报错 maven子模块版本继承_java_04

                只有打包方式为pom的Maven 工程能够管理其他Maven 工程。打包方式为pom 的Maven 工程中不写业务代码,它是专门管理其他 Maven工程的工程。

        4.2创建模块工程

                模块工程类似于IDEA中的 module,所以需要进入pro03-maven-parent工程的根目录,然后运行mvnarchetype:generate命令来创建模块工程。
                假设,我们创建三个模块工程:(从继承的角度来说是父工程和子工程的关系,从聚合的角度来说是总工程和模块工程的关系)

maven 多级模块 单独编译子模块报错 maven子模块版本继承_maven_05

        创建好了之后我们再打开父工程的pom.xml文件,会发现新增了这几个标签项

maven 多级模块 单独编译子模块报错 maven子模块版本继承_xml文件_06

        打开任意一个子工程的pom.xml文件,会发现自动生成了parent标签 

                子工程的groupId 如果和父工程一样,则可以省略

                子工程的version 如果和父工程一样,则可以省略

                省略 groupId和 version 后,子工程自己的坐标可以只保留artifactId 

maven 多级模块 单独编译子模块报错 maven子模块版本继承_maven_07

         4.3在父工程中统一管理依赖信息

maven 多级模块 单独编译子模块报错 maven子模块版本继承_xml文件_08

                哪个子工程需要哪个依赖,就在该子工程的pom.xml文件中去配置依赖的坐标即可,可不配置version ,例如子工程pro04-maven-modul需要spring-core,就在其pom.xml文件中配置相应坐标即可

maven 多级模块 单独编译子模块报错 maven子模块版本继承_jar包_09

         4.4在父工程中修改依赖的版本

                首先确认一下新的版本的有无,最好去mvnrepository官网去搜索确认一下,确认有这个版本的话,再去父工程中修改,去父工程中修改之后,所有子工程的版本号会自动修改(所以,采用子工程继承父工程最大的好处就是进行一个版本的管理,若不采用这种机制的话,一个工程一个工程的去修改版本号,很容易造成遗漏)

maven 多级模块 单独编译子模块报错 maven子模块版本继承_spring_10

 上面的步骤其实并没有做到一处修改处处生效,那么怎么才能做到一处修改处处生效呢,我们注意一下父工程的pom.xml文件中的properties标签,里面是可以自定义标签的

maven 多级模块 单独编译子模块报错 maven子模块版本继承_xml文件_11

 

maven 多级模块 单独编译子模块报错 maven子模块版本继承_xml文件_12

 这样以来,我们只需要修改我们的自定义标签,即可修改所有的引用了自定义标签的version值。当然子工程中同样也是有自定义标签的,用法相同,这里就不再做过多的介绍

maven 多级模块 单独编译子模块报错 maven子模块版本继承_spring_13