网站开发转软件开发/网络营销推广的方式
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.0https://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
也会被一起构建。
详细的代码可以参考下面的链接:
- Maven的聚合
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 {@Testpublic 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”。
项目的详细源码如下:
- 继承-谁先声明,先解析谁