maven聚合与继承

在这个技术飞速发展的时代,各类用户对软件的要求越来越高,软件本身也变得越来越复杂。因此,软件设计人员往往采用各种方式对软件划分模块,以得到更清晰的设计及更高的重用性。当把Maven应用到实际项目中的时候,也需要将项目分成不同的模块。Maven的聚合特性能够把项目的各个模块聚合在一起构建,而Maven的继承特性则能够抽取各个模块相同的依赖和插件等配置,再简化POM的同时,还能促进各个模块配置的一致性。

1、聚合

我们想构件多个项目,而不是到两个模块的目录下分别执行mvn命令。Maven聚合(或者称为多模块)这一特性就是为改需求服务的。为了能够使用一条命令就能构建多个模块,我们需要创建一个额外模块(放在最顶层),一般称为父模块,然后通过该模块构建整个项目的所有模块。root模块本身作为一个maven项目,他必须要有自己的POM,由于父模块只是为了消除配置的重复,因此它本身不包含除POM之外的项目文件,也就不需要src/main/java之类的文件夹了。


其pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.test</groupId>
    <artifactId>test-root</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>test-dao</module>
        <module>test-util</module>
        <module>test-web</module>
        <module>test-service</module>
    </modules>

packaging值必须为pom,否则无法进行构建,Maven项目中声明任意数量的module元素来实现模块的聚合。

2、继承

2.1 parent

有了父模块,就需要让其他模块来继承它,子模块的pom配置如下:

  <parent>
        <artifactId>test-root</artifactId>
        <groupId>com.test</groupId>
        <version>1.0-SNAPSHOT</version>
	<relativePath></relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>test-web</artifactId>
    <packaging>war</packaging>
    <name>bioinfo-web Maven Webapp</name>
    <url>http://maven.apache.org</url>

parent元素声明父模块,元素relativePath表示父模块POM的相对路径,默认值是../pom.xml,也就是说,Maven默认父POM在上一层目录下。
1、正确的设置relativePath非常重要。考虑这样一种情况,开发团队的新来成员从源码库签出一个包含父子模块的maven项目。由于只关心其中的某一个子模块,它就直接到该模块目录下执行构建,这个时候,父模块没有安装到本地仓库,因此如果子模块没有设置正确的relativePath,Maven将无法找到父POM,这将直接导致构建失败。如果Maven能够根据relativePath找到父POM,它就不需要再去检查本地仓库。

2.2可继承的POM元素

groupId :项目组 ID ,项目坐标的核心元素;
version :项目版本,项目坐标的核心元素;
description :项目的描述信息;
organization :项目的组织信息;
inceptionYear :项目的创始年份;
url :项目的 url 地址
develoers :项目的开发者信息;
contributors :项目的贡献者信息;
distributionManagerment :项目的部署信息;
issueManagement :缺陷跟踪系统信息;
ciManagement :项目的持续继承信息;
scm :项目的版本控制信息;
mailingListserv :项目的邮件列表信息;
properties :自定义的 Maven 属性;
dependencies :项目的依赖配置;
dependencyManagement :醒目的依赖管理配置;
repositories :项目的仓库配置;
build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
reporting :包括项目的报告输出目录配置、报告插件配置等。

2.3依赖管理

上面的可继承元素列表中包含dependencies元素,说明依赖是会被继承的,我们可以利用这一特性,将子模块的公共依赖提取到父模块的pom中配置,简化依赖配置、保持版本的统一。但是这却存在问题,例如util只需要一些普通的jar,难道也要让它依赖spring的一些jar吗,这显然是不合理。

Maven元素提供dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。
<dependencyManagement>
        <dependencies>
            <!--单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!--SpringMVC配置-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
  <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
</dependencyManagement>

这里使用dependencyManagement声明的依赖即不会给父模块引入依赖,也不会给它的子模块引入依赖,不过这段配置是会被继承的。

修改子模块的依赖配置:
  <dependencies>
   
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
</dependencies>

上述的配置较原来简单些,只配置了groupId和artifactId,省去了version。这些信息可以省略是因为子模块继承了父模块dependencyManagement配置,完整的依赖声明已经包含在父POM中。

使用这种依赖配置似乎不能减少太多的POM配置,不过笔者还是强烈推荐采用这种方法。其主要原因在父pom中使用dependencyManagement声明依赖能够统一项目范围中依赖的版本。如果子模块不声明依赖的使用,即使该模块已经在父模块中声明,也不会产生任何的效果。例如上面的子模块中没有声明spring-core,那么该模块就不会被引入。

2.4插件管理

类似的,maven也提供了pluginManagement元素帮助管理插件。

3、继承与聚合的关系

聚合主要为了方便加快项目的构件,而继承主要是为了消除重复配置。

4、反应堆

在一个多模块的Maven项目中,反应堆是指所有模块组成的一个构件结构。对于单模块的项目,反应堆就是该模块本身,对于多模块的项目来说,反应堆就包含了各个模块之间的继承与依赖关系,从而能够计算出合理的模块构件顺序。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值