一、Maven简介

Maven是apache下的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。主要包括:

 

  • 项目对象模型(Project Object Model) : POM对象模型,每个maven工程中都有一个pom.xml文件,定义工程所依赖的jar包、本工程的坐标、打包运行方式。。
  • 依赖管理系统(基础核心) : maven通过坐标对项目工程所依赖的jar包统一规范管理。
  • maven定义一套项目生命周期 : 清理、初始化、编译、测试、报告 、打包、部署、站点生成
  • 一组标准集合 : maven工程有自己标准的工程目录结构、定义坐标有标准。
  • maven 管理项目生命周期过程都是基于插件完成的

 

它负责管理项目开发过程中的几乎所有的东西:

 

  • 版本 : maven有自己的版本定义和规则
  • 构建 : maven支持许多种的应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。
  • 输出物管理 : maven可以管理项目构建的产物,并将其加入到用户库中。这个功能可以用于项目组和其他部门之间的交付行为。
  • 依赖关系 : maven对依赖关系的特性进行细致的分析和划分,避免开发过程中的依赖混乱和相互污染行为
  • 文档和构建结果 : maven的site命令支持各种文档信息的发布,包括构建过程的各种输出,javadoc,产品文档等。
  • 项目关系 : 一个大型的项目通常有几个小项目或者模块组成,用maven可以很方便地管理
  • 移植性管理 : maven可以针对不同的开发场景,输出不同种类的输出结果。

 

 

二、Maven仓库

Maven仓库分为中央仓库、本地仓库以及私服库:

2.1 中央仓库

中央仓库就是远程仓库,仓库中jar由专业团队(maven团队)统一维护。

中央仓库的地址:http://repo1.maven.org/maven2/

2.2 本地仓库

相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(电脑上的某个文件夹)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找。

2.3 私服

在公司内部架设一台私服,其它公司架设一台仓库,对外公开。

 

三、Maven生命周期

Maven有三套相互独立的生命周期,分别是:clean、default、site。clean主要是清理项目、default是Maven最核心的的构建项目、site是生成项目站点。每一个大的生命周期又分为很多个阶段。后面的阶段依赖于前面的阶段,这点有点像Ant的构建依赖。生命周期本身相互独立,用户可以仅仅调用生命周期的某一个阶段,也就是说用户调用了default周期的任何阶段,并不会触发clean周期以及site周期的任何事情。三大生命周期蕴含着小小的阶段,我们按顺序看一下:

          

java make项目maven maven项目介绍_生命周期

3.1 clean周期:

  • pre-clean:准备清理
  • clean:真正的清理工作
  • post-clean:执行清理后的一些后续工作

 

3.2 default周期:

 

  • validate:验证
  • initialize:初始化配置
  • generate-sources:生成源代码编译目录
  • process-sources:处理项目主资源文件,复制资源文件到outputclasspath
  • generate-resources:生成资源目录
  • process-resources:处理资源文件
  • complie:编译源代码
  • process-classes:处理编译后文件
  • generate-test-sources:生成测试目录
  • process-test-sources:处理项目测试资源文件,复制测试资源文件到outputclasspath
  • generate-test-resources:生成测试资源文件
  • process-test-resources:处理测试资源文件
  • test-compile:编译测试代码
  • process-test-classes:处理测试代码
  • test:单元测试运行测试代码
  • prepare-package:打包前的准备
  • package:将编译好的代码打包成为jar或者war或者ear等等
  • pre-integration-test:准备整体测试
  • integration-test:整体测试
  • post-integration-test:为整体测试收尾
  • verify:验证
  • install:安装到本地Maven库
  • deploy:将最终包部署到远程Maven仓库

 

3.3 site周期:

  • pre-site:准备生成站点
  • site:生成站点及文档
  • post-site:站点收尾
  • site-deploy:将生成的站点发布到服务器上

 

四、Maven聚合

随着技术的飞速发展和各类用户对软件的要求越来越高,软件本身也变得越来越复杂,然后软件设计人员开始采用各种方式进行开发,于是就有了我们的分层架构、分模块开发,来提高代码的清晰和重用。针对于这一特性,maven也给予了相应的配置。

我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工作,这时Maven给出了聚合的配置方式。

所谓聚合,顾名思义,就是把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven 工程。建立该project的时候,我们要注意以下几点:

  • 聚合模块本身也做为一个Maven项目,它必须有自己的POM
  • 它的打包方式必须为:pom
  • 引入了新的元素:modules---module
  • 版本:聚合模块的版本和被聚合模块版本一致
  • 相对目录:每个module的值都是一个当前POM的相对目录
  • 目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和<module>模块所处的目录</module>相一致
  • 习惯约定:为了方便构建,通常将聚合模块放在项目目录层的最顶层,其它聚合模块作为子目录存在。这样当我们打开项目的时候,第一个看到的就是聚合模块的POM
  • 聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/Java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。
  • 聚合模块和子模块的目录:他们可以是父子类,也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改。

 

 

五、Maven继承

我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的元素,比如说每个模块都需要Junit,使用spring的时候,其核心jar也必须都被引入,在编译的时候,maven-compiler-plugin插件也要被引入。这时我们采用继承,就不用在每个子模块分别定义了。
如何配置继承:

  • 说到继承肯定是一个父子结构,那么我们在父工程中来创建一个parent project
  • <packaging>: 作为父模块的pom,其打包类型也必须为pom
  • 结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录
  • 新的元素:<parent>
  • <parent>元素的属性:<relativePath>: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找
  • relativePath的默认值: ../pom.xml
  • 子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素