1、聚合
一个带有模块的项目称为“多模块”或“聚合器”项目。模块是POM
列出的项目,并作为一个组执行。一个pom
打包的项目可以通过将它们作为模块来聚合一组项目的构建,这些模块是这些项目的目录或pom
文件的相对路径。
<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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<packaging>pom</packaging>
<modules>
<module>my-project</module>
<module>another-project</module>
<module>third-project/pom-example.xml</module>
</modules>
</project>
在列出模块时,您不需要考虑模块间的依赖关系,也就是说,POM给出的模块的顺序并不重要。Maven将在拓扑上对模块进行排序,这样依赖项总是在依赖模块之前构建。
继承和聚合创建了一个良好的动态,通过一个单一的高级POM来控制构建。你经常会看到既有继承又有聚合的项目。例如,整个maven核心都是通过一个基本的POM org.apache.maven:maven
来运行的。因此构建maven项目可以由单个命令执行:mvn compile
。然而,尽管就整个POM项目而言,一个聚合项目和一个继承项目是不一样的,不应该被混淆。一个POM项目可能来自于继承但不是必须的——它还可能是其它任何类型的聚合模块。相反,一个POM项目可能只涉及到聚合而不涉及到继承。
下面我们举例来说明,之前的文章中,我们已经成功的创建了两个Maven项目,一个是my-app
,另一个是maven-parent
,这两个项目都是采用的继承的模式,现在我们可以用聚合的方式将其组合成一体,比如说将maven-parent
聚合到my-app
中,具体的做法是修改my-app
中的父类pom.xml
即可。
my-app
中的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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>myapp1</module>
<module>myapp2</module>
<module>myapp3</module>
<module>myapp4</module>
<module>myapp5</module>
<module>myapp6</module>
<module>my-app-site</module>
<module>my-webapp</module>
<module>maven-parent</module>
</modules>
<name>my-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
通过这样的变化,它们就成功的聚合到了一起,通过在my-app
中的pom.xml
执行相应的构建,其所聚合的项目maven-parent
也会被一起构建。
详细的代码可以参考下面的链接:
2、继承
在之前的文章中,我就已经多少谈到了Maven的继承,在这里我重点谈一下Maven的继承原则,在Maven中一共有两大继承原则。
其一是:短路优先原则
我们假设有项目D,项目E,项目F三个项目,在项目D,和项目E中都存在一个类Say
,它们的源码如下:
项目D中的类Say:
package com.lyc;
public class Say {
public String say(){
return "D";
}
}
项目E中的类Say:
package com.lyc;
public class Say {
public String say(){
return "E";
}
}
在项目E中存在测试类SayTest
,在项目F中也存在测试类SayTest
,它们的源码都相同,都如下:
项目E、F中的类SayTest
:
package com.lyc;
import org.junit.Test;
public class SayTest {
@Test
public void test(){
Say say = new Say();
System.out.println(say.say());
}
}
由于我们知道,Maven允许继承,在这种情况下,F依赖了E,E又依赖了D,这样在运行F中的SayTest
类时,我们根据最短路径原则不难知道,在F中运行的是输出项目E中的Say类,此时我们输出为E。
当我们在运行项目E中的SayTest
类时,其输出的也是E,这也同样不违反该定律,因为毕竟调用自身的Say
,类要比调用依赖的Say类依赖路径更短。
详细的源代码如下:
其二是:谁先声明,先解析谁
这个比较好理解,就是我们假设现在有三个项目,分别为项目H、项目I、项目J三个项目,现在在项目H,和项目I中都存在类Say
,然后在项目J中存在测试类SayTest
,下面是项目J中的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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>maven-parent3</artifactId>
<groupId>com.lyc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>J</artifactId>
<packaging>jar</packaging>
<name>J</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.lyc</groupId>
<artifactId>H</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lyc</groupId>
<artifactId>I</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
在项目J中运行测试类SayTest
,根据谁先声明,先解析谁的原理,由于项目H在项目J中优先声明,因而在项目J中调用SayTest
时输出的内容为“H”。
项目的详细源码如下: