Maven聚合与继承

本文详细介绍了Maven的聚合和继承特性。通过聚合,可以一次性构建多个项目,简化构建流程;通过继承,可以抽取公共配置,减少重复,保持模块一致性。文中提供实例展示如何配置聚合模块和父模块,以及依赖和插件管理的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Maven的聚合特性能够把项目的各个模块聚合在一起构建,而maven的继承特性怎能帮助抽取各个模块相同的依赖和插件配置,在简化pom的同时,促进各个模块的一致性。

(一)聚合
聚合可以一次构建多个项目,而不是到多个模块的目录下分别执行mvn命令。

聚合实例:
创建一个新的模块,命名为account-aggregator。通过该模块可以聚合多个项目。注意:该模块的文件夹放置的位置 会导致与其他模块是父子关系,还是并行关系。
1,如果聚合模块与其他模块放在同一个文件夹里,那就是平行关系:
文件夹位置:
这里写图片描述
在聚合模块中,只需要pom文件,其他的src/main/java 和src/main/test文件夹都可以直接删除。并修改pom中的配置如下:

  <groupId>com.juvenxu.mvnbook.account</groupId>
  <artifactId>account-aggregator</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--打包方式必须为pom-->
  <packaging>pom</packaging>

  <name>account-aggregator</name>

  <!--这样会是三者 平行关系-->
  <modules>
    <module>../chapter05</module>
    <module>../chapter08</module>
  </modules>

运行聚合模块后,会出现如下结果:
这里写图片描述
2、建议将多个项目放在聚合模块文件夹的里面,这样形成父子关系。修改的pom为:

 <groupId>com.juvenxu.mvnbook.account</groupId>
  <artifactId>account-aggregator</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--打包方式必须为pom-->
  <packaging>pom</packaging>

  <name>account-aggregator</name>

  <!--这样会是三者 父子关系-->
  <modules>
    <module>chapter05</module>
    <module>chapter08</module>
  </modules>

对多个项目执行mvn命令时,直接在聚合模块下执行,结果如下:
这里写图片描述
显示 的是各模块的名字,所有建议配置合理的name字段。

(二)继承
不同模块中有很多相同的配置,比如:groupid和version,有相同的spring-core,spring-beans,spring-context和junit依赖等。这些重复可以通过继承消除。

创建pom的父子结果,在父Pom中声明一些配置供子pom继承。

1、新创建一个account-parent模块,也只有一个文件pom,用作父pom。该模块放置的位置也是与其他模块是平行的。
这里写图片描述
父pom文件如下:

  <groupId>com.juvenxu.mvnbook.account</groupId>
  <artifactId>account-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--继承中,打包方式也是pom-->
  <packaging>pom</packaging>
  <name>account-parent</name>

让其他模块来继承该父pom。例如在account-email中,对其pom作如下修改:

  <!--声明父模块-->
  <parent>
    <groupId>com.juvenxu.mvnbook.account</groupId>
    <artifactId>account-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--父模块的相对位置,与当前文件平行的account-parent目录下的pom.xml-->
    <relativePath>../account-parent/pom.xml</relativePath>
  </parent>

  <artifactId>account-email</artifactId>

  <packaging>jar</packaging>

这个修改后的account-email没有groupid和version,实际上,这个子模块隐式从父模块继承了这两个元素。父子模块使用同样的groupid和version。如果子模块需要使用不同的groupid和version,那么可以在子模块中显式声明。

同样,还需要把account-parent模块加入到聚合中:

  <modules>
    <module>../chapter05</module>
    <module>../chapter08</module>
    <module>../account-parent</module>
  </modules>

2、依赖管理
也可以将dependencies元素中的依赖,通过继承来消除重复。将这些重复的依赖配置到父模块中,可以简化配置。

但是在父模块中配置的依赖,并不是每一个子模块都需要引用。可以使用dependencyManagement元素能让子模块灵活继承父模块的依赖配置。

account-parent中使用dependencyManagement元素:

  <!--通用的version值-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <springframework.version>4.3.3.RELEASE</springframework.version>
    <junit.version>4.7</junit.version>
  </properties>

  <!--父模块中,将子模块可能要使用的依赖都配置-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${springframework.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${springframework.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${springframework.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${springframework.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

这段配置不会给account-parent引入依赖,也不会给子模块引入依赖。子模块可以根据自己的需求对其进行继承其中的某一些依赖。
例如,在account-email中继承该依赖,配置如下:

 <dependencies>
    <!--junit可以不配置版本号version和scope。这些都是通过继承得到-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
    </dependency>

子模块只需要配置简单的groupid和artifactid就行,其他信息从父模块中继承得到。
如果子模块不需要某个依赖,不声明就行,该依赖不会被引入。

对于插件的管理,可以使用pluginManagement。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值