一、什么事 maven
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
即maven是一个软件(特别是java软件)项目管理及自动构建(从源码到成品的过程)工具,有Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,maven利用一个中央信息片段能管理一个项目的构建、报告和文档等步骤。简而言之是一个构建工具、以来管理工具以及项目信息聚合工具。
二、maven的安装与环境的配置
1、windows安装maven
①、从官网下载maven
②、解压到想要安装maven的文件夹中
③、进入系统环境配置环境
④、在终端输mvn -v查看环境是否配置成功
maven安装成功,即可使用,以下为本地仓库(默认为c盘)与阿里的仓库镜像(使用默认官网仓库,会因翻墙二导致速度慢甚至可能无法下载)的配置
⑤、进入安装目录,找到conf目录中的setting文件并打开
⑥、查找<localRepository></localRepository>标签,去掉对次标签的注释并修改为自己的本地仓库地址(我的本地仓库为D:/mvn/repo):<localRepository>D:/mvn/repo</localRepository>
⑦、查找<mirrors></mirrors>标签,在标签内加入如下内容:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
⑧、修改成功后保存,进入终端输入:mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.chinasofti.build -DartifactId=demo,即可测试是否配置成功。
2、linux安装maven
三、maven的生命周期
1、依赖的生命周期
依赖的生命周期—用来控制项目编译时需要使用哪套classpath,比如测试时会将junit.jar加入编译环境,但是发布产品时又不会将junit.jar加入到编译环境。
•compile:编译时依赖在所有阶段都可以获得(编译依赖范围)。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测 试、运行三种classpath都有效。典型的例子就是spring-core,在编译、测试、运行的时候都需要该依赖。
•test:测试范围依赖,仅在编译和运行单元测试时需要。该依赖只对于测试classpath有效,在编译主代码或者运行项目时,此依赖无效。典型的例子就是Junit,它只有在编译测试代码及运行测试的时候才需要。
•provided:已提供的依赖范围。该依赖对于编译和测试classpath有效,但在运行时无效。典型的例子就是servlet- api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要在maven重复的引入一遍。
•runtime:提供的依赖范围用来编译应用程序(运行时依赖范围),但无需部署。若用到jdk或者应用服务器提供的JAR,则使用此范围,servlet APIs就属于这个依赖范围。测试时,此依赖范围也加入到classpath。该依赖对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
•system:本地依赖(系统范围依赖)。该依赖与provided依赖范围完全一致。但是使用system范围的依赖时必须通过systemPath指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用该依赖.
依赖范围(scope) | 编译时依赖 | 测试时依赖 | 运行时依赖 | 是否打入包 | 例子 |
compile | Y | Y | Y | Y | SLF4J |
provided | Y | Y | Y | N | SERVLET-API |
test | N | Y | N | N | JUNIT |
runtime | N | Y | Y | Y | MYSQL JDBC DRIVER |
system | Y | Y | Y | Y | 有nexus后,不用system |
依赖传递:只有编译和运行时才能依赖传递
①简单传递:A->B->C => A->C
②其他传递:A->B->C(0.1)
A->C(0.2)
需遵循原则:最短路径原则 最终依赖为A->C(0.2)
A->B->C(0.1)
A->D->C(0.2)
遵循原则:第一申明原则 最终依赖为C(0.1)
2、构建的生命周期
maven对构建(build)的过程进行了抽象和定义,这个过程被称为构建的生命周期(lifecycle)。 生命周期(lifecycle)由多个阶段(phase)组成,每个阶段(phase)会挂接一到多个goal。 goal是maven里定义任务的最小单元,相当于ant里的target。 可以理解maven为一个插件的容器,每个插件绑定到某个goal执行。其中lifecycle又有defualt、clean、site三大独立的生命周期组成。
①clean:目的是清理项目
1)pre-clean:执行一些清理前需要完成的工作
2)clean:清理上一次构建生成的文件
3)post-clean:执行一些清理后需要完成的工作
②default:目的是构建项目
③site:目的是建立项目站和发布站点。maven能够基于pom所包含的信息,自动生成一个侯浩的站点,方便团队交流和发布项目信息。
1)pre-site执行一些在生成项目站点之前需要完成的工作
2)site生成项目站点文档
3)post-site执行一些在生成项目站点后需要完成的工作
4)site-deploy将生成的项目站点发布到服务器上