Maven:聚合和继承

本文详细介绍了Maven在多模块项目中的聚合和继承特性。通过实例展示了如何配置聚合模块,实现一键构建所有子模块,并通过继承简化POM配置。同时,探讨了Maven的‘约定优于配置’原则和反应堆概念。
摘要由CSDN通过智能技术生成
在实际项目的开发过程中,经常会根据需要将项目分成不同的模块,针对多模块的项目,Maven推出了如下两个特性: 
  1.聚合:把项目的各个模块聚合在一起构建; 
  2.继承:抽取各个模块相同的依赖和插件等配置,简化POM配置,促进各个模块配置的一致性; 
一、聚合实践 
下面我们就以一个多模块的项目,跟大家讲解如何使用Maven的聚合和继承属性; 
1.首先我们看下多模块项目的项目目录(如下图),包含聚合模块phonemodules(通过该模块构建整个项目所有模块)、main模块和service模块; 
phonemodules config main [phonemudules.main] main.iml phonemudules.main.iml m pom.xml service [phonemodules.service] phonemodules.service.iml m pom.xml service. i ml phonemodules.iml m pom.xml External Libraries
2.编辑聚合模块(该模块没有源代码,仅仅是一个pom.xml,帮助聚合其他模块构建的工具,它本身无实质内容)的pom.xml文件如下, 
<!--聚合模块:--> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <!--与聚合的子模块groupId、version一致--> 
    <groupId>com.chengxiang</groupId> 
    <version>1.0-SNAPSHOT</version> 
    <!--独立的artifactId--> 
    <artifactId>aggregator</artifactId> 
 
    <!--聚合模块的packaing必须pom,否则无法构建--> 
    <packaging>pom</packaging> 
 
    <!--聚合的子模块service,main--> 
    <modules> 
        <module>service</module> 
        <module>main</module> 
    </modules> 
    ... ...  
</project> 
3.在父模块目录下,运行mvn clean install结果如下: 
C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules>mvn clean install 
//解析聚合模块的POM,分析要构建的够快,计算出一个反应堆构建顺序,然后根据这个顺序依次构建 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Reactor Build Order: 
[INFO] 
[INFO] aggregator 
[INFO] service 
[INFO] main 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building aggregator 1.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ aggregator --- 
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ aggregator --- 
[INFO] Installing C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules\pom.xml to C:\Users\chengxiang.peng.QUNARSERVERS\.m2\repository\com\chengxiang\aggregator\1.0-SNAPSHOT\aggregator-1.0-SNAPSHOT.pom 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building service 1.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ service --- 
[INFO] Deleting C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules\service\target 
... ...  
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ service --- 
[INFO] Building jar: C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules\service\target\service-1.0-SNAPSHOT.jar 
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ service --- 
[INFO] Installing C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules\service\target\service-1.0-SNAPSHOT.jar to C:\Users\chengxiang.peng.QUNARSERVERS\.m2\repository\com\chengxiang\service\1.0-SNAPSHOT\service-1.0-SNAPSHOT.jar 
[INFO] Installing C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules\service\pom.xml to C:\Users\chengxiang.peng.QUNARSERVERS\.m2\repository\com\chengxiang\service\1.0-SNAPSHOT\service-1.0-SNAPSHOT.pom 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building main 1.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ main --- 
[INFO] Deleting C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules\main\target 
... ... 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ main --- 
[INFO] Building jar: C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules\main\target\main-1.0-SNAPSHOT.jar 
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ main --- 
[INFO] Installing C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules\main\target\main-1.0-SNAPSHOT.jar to C:\Users\chengxiang.peng.QUNARSERVERS\.m2\repository\com\chengxiang\main\1.0-SNAPSHOT\main-1.0-SNAPSHOT.jar 
[INFO] Installing C:\Users\chengxiang.peng.QUNARSERVERS\MavenSources\phonemodules\main\pom.xml to C:\Users\chengxiang.peng.QUNARSERVERS\.m2\repository\com\chengxiang\main\1.0-SNAPSHOT\main-1.0-SNAPSHOT.pom 
[INFO] ------------------------------------------------------------------------ 
[INFO] Reactor Summary: 
[INFO] 
[INFO] aggregator ......................................... SUCCESS [  0.425 s] 
[INFO] service ............................................ SUCCESS [  2.509 s] 
[INFO] main ............................................... SUCCESS [  0.614 s] 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 3.683 s 
[INFO] Finished at: 2016-10-22T22:31:28+08:00 
[INFO] Final Memory: 19M/197M 
[INFO] ----------------------------------------------------------------------- 
二、继承实践 
通过使用Maven的聚合特性我们已经能通过一个命令来构建多个模块了。那么我们如何使用继承来精简POM文件呢,如下介绍: 
1.创建一个父模块(这里我们将聚合模块和父模块为同一个模块)phonemodules(项目目录还是如上图所示),在父模块的POM中提供一些配置供子模块POM继承,以实现“一处声明,多处使用”的目的。父模块pom.xml如下: 
<project> 
    <modelVersion>4.0.0</modelVersion> 
 
    <groupId>com.chengxiang</groupId> 
    <version>1.0-SNAPSHOT</version> 
    <artifactId>aggregator</artifactId> 
    <!--聚合模块和父模块的packaing必须pom--> 
    <packaging>pom</packaging> 
 
    <!--版本属性等--> 
    <properties> 
        <!-- junit版本等--> 
        <junit.version>4.12</junit.version> 
        <jxr.version>2.5</jxr.version> 
    </properties> 
    … …  
 
    <!--构建配置--> 
    <build> 
        <!--插件管理:如依赖管理dependencyManagement所述,提供给子模块继承--> 
        <pluginManagement> 
            <plugins> 
                <!--生成源码报告插件--> 
                <plugin> 
                    <groupId>org.apache.maven.plugins</groupId> 
                    <artifactId>maven-jxr-plugin</artifactId> 
                    <version>${jxr.version}</version> 
                </plugin> 
            </plugins> 
        </pluginManagement> 
    </build> 
 
    <!--报告配置,提供给子模块继承--> 
    <reporting> 
        <plugins> 
            <!--生成源码报告插件--> 
            <plugin> 
                <groupId>org.apache.maven.plugins</groupId> 
                <artifactId>maven-jxr-plugin</artifactId> 
                <version>${jxr.version}</version> 
                <reportSets> 
                    <reportSet> 
                        <id>aggregate</id> 
                        <reports> 
                            <report>aggregate</report> 
                            <report>test-aggregate</report> 
                        </reports> 
                    </reportSet> 
                </reportSets> 
            </plugin> 
        </plugins> 
    </reporting> 
 
    <!--依赖管理:既不会给子模块引入依赖,也不会给他的子模块引入依赖(如果子模块不声明依赖,即使父POM的denpendyManagment中声明了也不会产生实际的效果),提供给子模块继承--> 
    <dependencyManagement> 
        <dependencies> 
            <!--子模块共同的依赖junit--> 
            <dependency> 
                <groupId>junit</groupId> 
                <artifactId>junit</artifactId> 
                <version>${junit.version}</version> 
            </dependency> 
        </dependencies> 
    </dependencyManagement> 
</project> 
注意:想要在另外一个模块使用完全一样的dependencyManagement配置,除了复制配置或者集成这两种配置之外,可以 使用import范围依赖导入这一配置; 
2.有了父模块,我们就需要让其它模块来继承它。接下来我们看看子模块service的pom.xml文件: 
<project> 
    <!--声明继承的父模块aggregator--> 
    <parent> 
        <groupId>com.chengxiang</groupId> 
        <artifactId>aggregator</artifactId> 
        <version>1.0-SNAPSHOT</version> 
        <relativePath>../pom.xml</relativePath> 
    </parent> 
     
    <modelVersion>4.0.0</modelVersion> 
 
    <!--没有groupId和artifactId,因为继承了父模块的,如果有不一样的,完全可以在子模块中显示的声明> 
    <artifactId>service</artifactId> 
    <!--不用声明packaging,默认为jar--> 
    <!--<packaging>jar</packaging>--> 
 
    <!--版本属性等--> 
    <properties> 
        <!-- httpclient,mysql,dbcp版本等--> 
        <fastjson.version>1.2.17</fastjson.version> 
        <mysql.version>5.1.38</mysql.version> 
        <dbcp.version>1.4</dbcp.version> 
    </properties> 
 
    <!--构建配置--> 
    <build> 
        <plugins> 
            <!--继承父模块的插件,不需要声明版本--> 
            <plugin> 
                <groupId>org.apache.maven.plugins</groupId> 
                <artifactId>maven-jxr-plugin</artifactId> 
            </plugin> 
        </plugins> 
    </build> 
 
    <dependencies> 
        <!--fastjson Json解析--> 
        <dependency> 
            <groupId>com.alibaba</groupId> 
            <artifactId>fastjson</artifactId> 
            <version>${fastjson.version}</version> 
        </dependency> 
        ... ...  
        <!--继承父模块的junit,故不需要定义version--> 
        <dependency> 
            <groupId>junit</groupId> 
            <artifactId>junit</artifactId> 
        </dependency> 
    </dependencies> 
    ... ...  
</project> 
3.可继承的POM元素 

可继承元素 

说明 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值