首先必须推荐的这本书《Maven实战》 许晓斌,机械工业出版社
其实使用Maven也有很久时间了,大部分都是别人建好了工程我使用一下,实际上并没有非常详细的使用经验,这次到新公司来,逼着自己从头开始搭建一个Maven工程,但有了以前的经验,上手还是很快的。
Maven是在Ant之后出现的,能够自动下载构建并管理依赖,这是它与Ant最大的区别。Ant也能实现生命周期的管理,但与Maven相比,付出的成本要更高一下。
通常使用镜像是结合私服,可以通过配置镜像代理任何外部公共仓库(包括中央仓库),可以将配置集中到私服,从而简化maven本身的配置。
Maven的生命周期就是为了对所有的构建过程进行抽象和统一,Maven从其他项目和开发中总结了一套高度完善的、易扩展的生命周期机制。
该生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和生成站点等所有的步骤。
Maven的生命周期是抽闲的,实际的任务交由插件完成,这种思想与设计模式中的模板方法类似,父类中定义整体的处理架构,子类来完成具体实现。
Maven拥有三套生命周期,相互独立,分别为clean、default和site,clean生命周期的目的是清理项目,default的生命周期目的是构建项目,而site生命周期是为了建立项目站点。
每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖前面的阶段,如clean包含pre-clean,clean和post-clean。
default生命周期包含了真正需要构件时所需要执行的所有步骤,它是所有生命周期中最为核心的部分。
处理项目的主资源文件,一般来说,是对/src/main/resources目录的内容进行变量替换之后,复制和输出到主的classpath目录去。
site生命周期的目的是建立和发布站点,Maven能够根据pom的信息,自动生成一个友好的站点,方便团队交流好发布项目信息。
Maven的核心仅仅定义了抽象的生命周期,具体任务是交由插件完成的,插件以独立构件存在。
对于插件本身,为了能够复用代码,往往可以完成多个任务。
Maven的生命周期于插件相互绑定,用以完成实际的构件任务,具体而言,是生命周期阶段与插件目标的相互绑定,以完成某个具体的构建任务。
插件绑定有内部绑定和自定义绑定两周。具体不表。
如果某个插件的配置值对整个项目生效,且不经常改变,可以将其配置到pom.xml中,如我们配置编译插件编译1.5版本的源文件并生成与JVM1.5兼容的字节码。
POM中插件任务的配置
除了为插件配置全局参数,用户还可以为某个插件任务配置特定的参数。如maven-antrun-plugin,它有一个run目标,可以调用Ant任务,用户将maven-antrun-plugin:run绑定到多个生命周期阶段上,再加上不同的配置,就可以实现在不同的生命周期执行不同的任务。
需要注意的是Codehaus可靠性较差
与依赖构件一样,插件构件同样依赖于坐标存放在Maven仓库中,在需要的时候,Maven会到本地仓库查找,如果不存在则从远程仓库下载。
一般来说中央插件库能够完全满足需要,我们没有必要去配置其他插件库。
默认可以不填写groupId,如果插件是Maven官方插件。
聚合和集成对Maven来说是非常必要的,Maven于其他面向对象编程语言一样,都试图减少重复代码并提供继承机制,来减少对pom.xml的配置工作量。
想象这样一种应用场景,如果我们的工程有两个模块,我们想通过一次maven命令的执行来构建这两个模块,Maven的聚合特性就是为这种需求服务的。
为了能够通过执行一次命令就构件两个模块,我们需要创建一个额外的模块,然后通过该模块来构件整个项目。
Modules配置节配置的是子模块的位置,注意需要制定子模块的位置,目录是相对该pom来说的。
为了解决重复问题,Maven设计了pom的继承规则,普通pom继承超级pom,同样的,普通的pom也可以继承依赖和插件等信息,可以继承的项有一个专项列表,这里不赘述。
我们需要创建POM的父子结构,然后提供一些元素给子POM继承,来实现一处生命,多处使用的目的。
同样的,子模块也需要修改才能继承父模块的pom,主要是子pom需要加入parent这一配置节,如下所示:
另外,用户可以在一个POM中,同时提供聚合和集成的功能。
但是还有一种情况:我们在父pom中定义的依赖,不能全部被子pom继承,这样会引入大量的不要的引用,基于此,maven提供了依赖声明和插件声明,用户在父pom中进行依赖生命和插件声明,并定义其版本号,在子pom中继承该pom并声明具体使用哪个依赖。
如此,可以将依赖的版本号设置为全局可控,通常而言,这样的设置已经可以满足要求。
在一个多模块的Maven项目中,反应堆(Reactor)是指所有模块组成的一个构建结构。对于单模块的项目,反应堆就是其本身,但是多模块而言,反应堆就包含了各个模块的构件关系,maven在构建时,可以自动判别依赖,并调整构建顺序。
另外,在构建时,maven还提供了多种命令,来指定具体的构件模块和构建顺序。