我们希望一次构建两个或更多项目,而不是到每个模块的目录下分别执行mvn命令,Maven 聚合这一特性就是为该需求服务的, 为了使用聚合,我们必须创建一个聚合模块,通过该模块与其他项目聚合,并且该模块可以为其他模块的父目录,也可以是平级目录,首先目录结构如下:
account-aggregator 模块的 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>org.drsoft.account</groupId>
????<artifactId>account-aggregator</artifactId>
????<version>1.0-SNAPSHOT</version>
????<!-- 聚合和父POM模块必须为 pom -->
????<packaging>pom</packaging>
???? ?
????<!-- 配置需要聚合的模块的相对目录 -->
????<modules>
????????<module>account-email</module>
????????<module>account-service</module>
????</modules>
</project>
? ?
此时,在account-aggregator目录下执行 Maven 命令,就会同时构建在 modules 中的模块,示例命令:
mvn clean
命令结果:
面向对象设计中,程序员可以建立一种类的父子结构,然后在父类中声明一些字段和方法供子类继承,这样就可以做到一处声明多处使用,类似的,我们也可以创建POM的父子结构,在父POM中声明一些配置供子POM继承,我们继续以聚合中的模块来说明,其account-aggregator模块POM不变,我们看子POM的account-service配置示例:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
????<modelVersion>4.0.0</modelVersion>
????<!-- groupId 和 version 一致,因此从父 POM 继承 -->
????<artifactId>account-service</artifactId>
????<name>account-service</name>
????<url>http://maven.apache.org</url>
????<!-- 父POM配置 -->
????<parent>
????????<!-- 父POM的项目组 -->
????????<groupId>org.drsoft.account</groupId>
????????<!-- 父POM的项目唯一标识 -->
????????<artifactId>account-aggregator</artifactId>
????????<!-- 父POM的版本 -->
????????<version>1.0-SNAPSHOT</version>
????????<!-- 父POM的文件相对路径,默认值:../pom.xml
(可选,如果设置了将首先根据该属性找父POM,找不到则从本地仓库查找)
-->
????????<relativePath>../pom.xml</relativePath>
????</parent>
</project>
我们可以看到 dependencies元素是可以被继承的,因此在父POM中声明的依赖都会被继承到子POM中,但还存在一个问题,我们无法确认将来添加的子模块一定需要目前所有的依赖项,可能只是简单的 util 工具模块,Maven 还提供了 dependencyManagement 元素既能让子元素模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性,在 dependencyManagement 元素下的依赖声明不会不会引入实际的依赖,不过他能约束dependencies下的依赖使用,配置示例如下:
<?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>org.drsoft.account</groupId>
????<artifactId>account-aggregator</artifactId>
????<version>1.0-SNAPSHOT</version>
????<packaging>pom</packaging>
????<name>account-aggregator</name>
????<url>http://maven.apache.org</url>
????<!-- 聚合模块 -->
????<modules>
????????<module>account-email</module>
????????<module>account-service</module>
????</modules>
????<!-- 实际依赖 -->
????<dependencies>
????????<dependency>
????????????<groupId>junit</groupId>
????????????<artifactId>junit</artifactId>
????????????<version>3.8.1</version>
????????????<scope>test</scope>
????????</dependency>
????</dependencies>
????<!-- 声明依赖,但不会实际依赖 -->
????<dependencyManagement>
????????<dependencies>
????????????<dependency>
????????????????<groupId>org.springframework</groupId>
????????????????<artifactId>spring-context</artifactId>
????????????????<version>4.3.6.RELEASE</version>
????????????</dependency>
????????</dependencies>
????</dependencyManagement>
</project>
查询 account-aggregate 依赖,命令如下:
mvn dependency:tree
命令结果:
根据依赖显示结果,发现其依赖关系中只有 junit,没有 org.springframework
<?xml version="1.0"?>
<project
????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
????xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
????<modelVersion>4.0.0</modelVersion>
????<artifactId>account-email</artifactId>
????<name>account-email</name>
????<url>http://maven.apache.org</url>
????<!-- 父POM配置 -->
????<parent>
????????<!-- 父POM的项目组 -->
????????<groupId>org.drsoft.account</groupId>
????????<!-- 父POM的项目唯一标识 -->
????????<artifactId>account-aggregator</artifactId>
????????<!-- 父POM的版本 -->
????????<version>1.0-SNAPSHOT</version>
????????<!-- 父POM的文件相对路径 -->
????????<relativePath>../pom.xml</relativePath>
????</parent>
????<!-- 依赖配置,依赖信息从父POM 的 dependencyManagement 内的依赖,
???????? 因此只需要 groupId 和 artifactId -->
????<dependencies>
????????<dependency>
????????????<groupId>org.springframework</groupId>
????????????<artifactId>spring-context</artifactId>
????????</dependency>
????</dependencies>
</project>
查询account-email的依赖,命令如下:
mvn dependency:tree
命令结果:
可以看到继承到了父POM的 junit依赖,和设置的 org.springframework 依赖
Maven 提供了 pluginManagement 元素帮助管理插件,该元素中配置的依赖不会造成实际的插件调用行为,但POM中配置了真正的plugins元素,并且其groupId和artifactId与pluginManagement中配置的插件匹配时,才会影响实际的插件行为。
<?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>org.drsoft.account</groupId>
????<artifactId>account-aggregator</artifactId>
????<version>1.0-SNAPSHOT</version>
????<packaging>pom</packaging>
????<name>account-aggregator</name>
????<url>http://maven.apache.org</url>
????<!-- 聚合模块 -->
????<modules>
????????<module>account-email</module>
????????<module>account-service</module>
????</modules>
????<build>
????????<!-- 插件管理-->
????????<pluginManagement>
????????????<plugins>
????????????????<plugin>
????????????????????<groupId>org.apache.maven.plugins</groupId>
????????????????????<artifactId>maven-source-plugin</artifactId>
????????????????????<version>3.0.1</version>
????????????????????<executions>
????????????????????????<execution>
????????????????????????????<phase>verify</phase>
????????????????????????????<goals>
????????????????????????????????<goal>jar-no-fork</goal>
????????????????????????????</goals>
????????????????????????</execution>
????????????????????</executions>
????????????????</plugin>
????????????</plugins>
????????</pluginManagement>
????</build>
</project>
<?xml version="1.0"?>
<project
????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
????xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
????<modelVersion>4.0.0</modelVersion>
????<artifactId>account-service</artifactId>
????<name>account-service</name>
????<url>http://maven.apache.org</url>
????<!-- 父POM配置 -->
????<parent>
????????<!-- 父POM的项目组 -->
????????<groupId>org.drsoft.account</groupId>
????????<!-- 父POM的项目唯一标识 -->
????????<artifactId>account-aggregator</artifactId>
????????<!-- 父POM的版本 -->
????????<version>1.0-SNAPSHOT</version>
????????<!-- 父POM的文件相对路径 -->
????????<relativePath>../pom.xml</relativePath>
????</parent>
????<build>
????????<!-- 子POM定义使用插件,只需要 groupId 和 artifactId
???????????? 其他由父POM的 pluginManagement 一定 -->
????????<plugins>
????????????<plugin>
????????????????<groupId>org.apache.maven.plugins</groupId>
????????????????<artifactId>maven-source-plugin</artifactId>
????????????</plugin>
????????</plugins>
????</build>
</project>
? ?
原文:http://www.cnblogs.com/li3807/p/6416223.html