在实际项目的开发过程中,经常会根据需要将项目分成不同的模块,针对多模块的项目,Maven推出了如下两个特性:
1.聚合:把项目的各个模块聚合在一起构建;
2.继承:抽取各个模块相同的依赖和插件等配置,简化POM配置,促进各个模块配置的一致性;
一、聚合实践
下面我们就以一个多模块的项目,跟大家讲解如何使用Maven的聚合和继承属性;
1.首先我们看下多模块项目的项目目录(如下图),包含聚合模块phonemodules(通过该模块构建整个项目所有模块)、main模块和service模块;
2.编辑聚合模块(该模块没有源代码,仅仅是一个pom.xml,帮助聚合其他模块构建的工具,它本身无实质内容)的pom.xml文件如下,
通过使用Maven的聚合特性我们已经能通过一个命令来构建多个模块了。那么我们如何使用继承来精简POM文件呢,如下介绍:
1.创建一个父模块(这里我们将聚合模块和父模块为同一个模块)phonemodules(项目目录还是如上图所示),在父模块的POM中提供一些配置供子模块POM继承,以实现“一处声明,多处使用”的目的。父模块pom.xml如下:
2.有了父模块,我们就需要让其它模块来继承它。接下来我们看看子模块service的pom.xml文件:
1.聚合:把项目的各个模块聚合在一起构建;
2.继承:抽取各个模块相同的依赖和插件等配置,简化POM配置,促进各个模块配置的一致性;
一、聚合实践
下面我们就以一个多模块的项目,跟大家讲解如何使用Maven的聚合和继承属性;
1.首先我们看下多模块项目的项目目录(如下图),包含聚合模块phonemodules(通过该模块构建整个项目所有模块)、main模块和service模块;
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元素
可继承元素 |
说明 |