继承与聚合
继承与聚合,我感觉对于多模块项目用的很多。
1.继承
项目可通过继承,继承得到一些pom元素,例如dependency、groupId等等,提高pom元素的重用,避免项目的pom过于臃肿。
在子模块项目的pom.xml中使用parent标签指定,父模块的pom的packaging标签下必须为pom
//子模块的pom.xml
<parent>
<groupId>xx.xx.xx</groupId>
<artifactId>xx</artifactId>
<version>xx</version>
<relativePath></relativePath>//继承的pom相对路径。可选,默认为../pom.xml,即父级目录下的pom
</parent>
可继承的元素
继承元素 | |
---|---|
groupId | 所以子类的groupId可以不写 |
version | 所以子类的version可以不写 |
properties | 自定义的Maven属性 |
dependencies | 项目的依赖配置 |
dependencyManagement | 项目的依赖管理配置 |
repositories | 项目的仓库配置 |
distributionManagement | 项目的部署配置 |
2.聚合
针对多模块项目,为实现同时构建多个项目,而不需要对每个项目都执行一遍maven命令,可聚合多个项目。
聚合的pom中的packageing必须为pom,这点与继承是一致的。
<moudles>
<moudle>模块一</moudle>
<moudle>模块二</moudle>
</moudles>
3.反应堆的构建顺序
聚合解决了多模块的构建问题,继承消除了多模块的重复配置。那针对多模块的构建,子模块之间可能还互相依赖,这时候mavne的构建顺序是什么呢?
多模块的maven反应堆,遵循先读取先构建,存在依赖先构建依赖的原则。因此maven不允许出现循环依赖,即A->B,B->A的情况出现,否则报错。
4.约定大于配置
为什么说约定大于配置,为什么源码放在src/main/java下,为什么项目的目录张这个样子?
所有的maven项目都会继承自一个超级pom文件,一般来说,文件在$MAVEN_HOME/lib/maven-model-builder-x.x.x.jar中的org/apache/maven/model/pom-4.0.0.xml
路径下。在这个项目中有着大量关于项目结构的配置,例如远程仓库地址(中央仓库)、插件仓库地址、代码输出目录、源代码目录、主资源目录、测试代码目录。
我们只需要花费很少的代价(自由),遵循Maven的规范,就能轻松的构建项目,而不是手动配置。这就是约定大于配置以及为啥目录长这样的原因。
当然我们也可以手动配置,而不去遵守这种约定
//项目的pom.xml下
<build>
<sourceDirectary>/xx/xx</sourceDirectary>//手动配置源码目录
......
</build>
灵活的构建
1. maven的属性
除了可以在一个项目中 使用properties元素自定义一些属性外,还有很多内置属性,${basedir}表示项目根目录,即包含pom.xml文件的目录;${version}表示项目版本等等
2.profile机制
为了方便的切换环境,可以使用maven提供的profile机制。
<profiles>
<profile>
<id>xx</id>
<properties>
<xx>自定义属性</xx>
</properties>
<activetion>
<activeByDefault>true</activeByDefault>//默认环境
</activetion>
//不同环境下的配置
</profile>
<profile>
<id>xx</id>
<properties>
<xx>自定义属性</xx>
</properties>
//不同环境下的配置
</profile>
</profiles>
虽然项目中的profile可配置属性很多,但是只能在这一个项目中使用,这并不是切换环境的本意。一般将profile放在用户目录下的setting.xml下。
用户目录下的setting.xml可配置的profile属性很少,只有repositories、pluginRepositories、properties这几个。
激活profile除了在profile中使用activeByDefault,还可以在setting中使用activeProfile元素
<setting>
......
<activeProiles>
<activeProfile>Profile的Id</activeProfile>
</activeProiles>
......
</setting>
实际上,也可以在IDEA的maven中选中不同的Profile。