标签:
前面也讲过聚合的作用就是把多个模块(maven工程)放在一个模块内部,这个模块就可以说成是一个聚合,单独构建聚合模块就会把聚合在一起的其他模块一起构建(也可以配置只编译其中一部分模块)。聚合模块的packageing必须是POM,聚合模块与被聚合的模块之间的关系如下图。
对于聚合模块来说,它知道有哪些被聚合的模块,但是被聚合的模块不知道这个聚合模块的存在。
假设聚合模块名为hello,需要聚合的模块名为hello1和hello2两个模块。这里只简单说一下聚合的配置方法,不涉及项目代码。
说明,这是聚合模块hello的根目录,首先是一个pom.xml配置文件,剩余的每一个目录表示一个maven工程,即需要聚合在一起的模块,如这里的hello1和hello2,其目录结构如下图所示,是一个单独的普通maven工程的目录结构
被聚合的模块放在聚合模块目录下,这个不是必须的,可以放在任何路径下,但是配置聚合模块的pom.xml时就需要配置能访问到被聚合模块的相对路径(被聚合模块相对于聚合模块的路径)了。建议放在聚合模块的根目录下,这样好管理(个人觉得这个有点违反“约定大于配置”的要求)。
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itsenlin</groupId> <artifactId>hello</artifactId> <strong><packaging>pom</packaging></strong> <version>0.0.1-SNAPSHOT</version> <name>hello Maven app</name> <strong> <modules> <module>hello1</module> <module>hello2</module> </modules></strong> </project>说明
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itsenlin</groupId> <artifactId>hello1</artifactId> <packaging>jar</packaging> <version>0.0.1-SNAPSHOT</version> <name>hello1 Maven app</name> <dependencies> ... </dependencies> <build> ... </build> .... </project>
也是一种maven工程,主要提取子模块的公共部分,我们称为父模块,减少子模块的重复,也可以统一子模块使用的依赖构件的版本。父模块的packageing必须是POM,父模块与子模块之间的关系如下图。
对于父模块来说,它不知道子模块的存在,而子模块中必须显示配置父模块的信息。
假设hello1和hello2模块有相同的部署需要提取,这样我们就可以创建一个hello-parent的模块当作hello1和hello2的父模块。
修改modules标签如下
<modules> <strong><module>hello-parent</module></strong> <module>hello1</module> <module>hello2</module> </modules>
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itsenlin</groupId> <artifactId>hello-parent</artifactId> <strong><packaging>pom</packaging></strong> <version>0.0.1-SNAPSHOT</version> <name>Parent config of helloN modules</name> </project>
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <strong> <parent> <groupId>com.itsenlin</groupId> <artifactId>hello-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../hello-parent/pom.xml</relativePath> </parent></strong> <artifactId>hello1</artifactId> <packaging>jar</packaging> <name>hello1 Maven app</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies> </project>说明
dependencies元素配置项目的依赖信息,这个元素也是可以被继承的,所以父工程中配置了下面的junit依赖的话,所有子工程都会依赖junit
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
hello/hello-parent/pom.xml中如下配置
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itsenlin</groupId> <artifactId>hello-parent</artifactId> <packaging>pom</packaging> <version>0.0.1-SNAPSHOT</version> <name>Parent config of helloN modules</name> <strong> <properties> <junit.version>4.12</junit.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement></strong> </project>说明
properties标签可以实现编程语言中的变量的概念,如这里的junit.version就是一个变量,值为4.12。下面直接使用${junit.version}来获取相应值
假如hello1需要依赖junit,则可以如下配置即可。
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.itsenlin</groupId> <artifactId>hello-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../hello-parent/pom.xml</relativePath> </parent> <artifactId>hello1</artifactId> <packaging>jar</packaging> <name>hello1 Maven app</name> <strong> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies></strong> </project>如果hello2中如果不需要junit的依赖,则把上面配置中的粗体部署的<dependency>删除即可。
在讲依赖范围的时候讲到maven2.0.9及以后版本引入了一个import的依赖范围。在这里才介绍是因为,这个只在dependencyManagement元素下才有效果。
使用此依赖范围的依赖通常指向一个POM类型的工程。作用是将目标POM中配置的dependencyManagement导入并合并到当前POM的dependencyManagement元素中。
例如下面配置
<dependencyManagement> <dependencies> <dependency> <groupId>xxxx</groupId> <artifactId>yyyy</artifactId> <version>zzzz</version> <strong><type>pom</type> <scope>import</scope></strong> </dependency> </dependencies> </dependencyManagement>
类似依赖管理
反应堆是指所有模块组成的一个构建结构,从模块之间的依赖与继承关系自动计算出合理的模块构建顺序。
在命令行下进入hello根目录执行mvn compile,可以看到如下打印
这个顺序并不仅是通过聚合模块的<module>的顺序来定的,而是还要考虑到模块之间的依赖及继承关系来定的。可以把hello模块中的module随意调整顺序,这个构建顺序中有依赖或继承关系的构建顺序是不变的(例如hello1与hello,hello2与hello),其他的工程以module的配置顺序。
一般来说直接整个项目构建即可,但是有些场景下也有这样的需求,只构建其中的某些模块,而不是全构建。这就需要使用maven提供的选项来控制了
mvn
例如
mvn compile -pl hello1,hello2
E:\java_workspace\hello>mvn compile -pl hello1,hello2 [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] hello2 Maven app [INFO] hello1 Maven app [INFO] [INFO] ------------------------------------------------------------------------
E:\java_workspace\hello>mvn compile -pl hello1 -am [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] Parent config of helloN modules [INFO] hello1 Maven app [INFO] [INFO] ------------------------------------------------------------------------
E:\java_workspace\hello>mvn compile -pl hello-parent -amd [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] Parent config of helloN modules [INFO] hello2 Maven app [INFO] hello1 Maven app [INFO] [INFO] ------------------------------------------------------------------------
mvn compile -pl hello-parent -amd -rf hello2
E:\java_workspace\hello>mvn compile -pl hello-parent -amd -rf hello2 [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] hello2 Maven app [INFO] hello1 Maven app [INFO] [INFO] ------------------------------------------------------------------------
《maven实战》
标签:
原文地址:http://blog.csdn.net/itsenlin/article/details/51296606