《Maven实战》阅读笔记(三)

继承与聚合

继承与聚合,我感觉对于多模块项目用的很多。

1.继承

项目可通过继承,继承得到一些pom元素,例如dependency、groupId等等,提高pom元素的重用,避免项目的pom过于臃肿。

在子模块项目的pom.xml中使用parent标签指定,父模块的pom的packaging标签下必须为pom

//子模块的pom.xml
<parent>
    <groupId>xx.xx.xxgroupId>
    <artifactId>xxartifactId>
    <version>xxversion>
    <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/xxsourceDirectary>//手动配置源码目录
    ......
build>

灵活的构建

1. maven的属性

除了可以在一个项目中 使用properties元素自定义一些属性外,还有很多内置属性,${basedir}表示项目根目录,即包含pom.xml文件的目录;${version}表示项目版本等等

2.profile机制

为了方便的切换环境,可以使用maven提供的profile机制。

<profiles>
    <profile>
        <id>xxid>
        <properties>
            <xx>自定义属性xx>
        properties>
        <activetion>
            <activeByDefault>trueactiveByDefault>//默认环境
        activetion>
        //不同环境下的配置
    profile>
    <profile>
            <id>xxid>
            <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的IdactiveProfile>
    activeProiles>
......
setting>

实际上,也可以在IDEA的maven中选中不同的Profile。

你可能感兴趣的:(Maven,java,maven)