1.Maven简介
1.Maven能干什么
1:依赖管理:通过一个xml文件,同一管理项目中所以jar包。开发项目时,需要用到的jar包只需在配置文件中配置好几个相关信息,Maven就会自动下载、导入到项目中,并且如果该jar包有依赖包,也会自动一并下载、导入。如果项目有jar包依赖冲突,只需通过Maven的 mvn -X compile dependency:tree -Dverbose 指令即可自动排查出冲突的jar包信息。
2:项目构建:这一步类似Ant,可以通过Maven的配置脚本批处理项目的编译、测试、打包、部署、发布等操作;
3:信息管理:管理项目的相关信息,比如版本信息、开发者信息等。
2.Maven依赖管理简介
1:在pom.xml中进行同一配置,管理;
2:对每个jar包,通过:groupId、artifactId、version 三个信息唯一确定一个jar包;
3:jar包的来源:在配置好jar包信息后,Maven是如何高效率地找到所需jar包并下载导入的?主要有三个来源。
1)本地资源库:Maven安装后会在本机创建一个reposity文件夹,执行pom.xml时会把jar包下载到这里来,如果已经有的,就不会再下载。相当于一个本地缓存。
2)共享资源库:即中央资源库,Maven有一个中央仓库存放来自全世界的共享jar包,通过配置的 groupId、artifactId、version 即可在中央仓库中唯一定位jar包,然后下载到本地资源库中。
3)私人资源库:也叫中转资源库。对于一个公司而言,有可以有自己开发的jar包,并且不想公开出去;还有,公司可以提供一个jar包中转站,把网上常用的jar包先下载到一个仓库中,公司程序员在本地资源库找不到所需jar包时可以先到公司的资源库寻找、下载,这样就无需到网上下载了。这个资源库就是私人资源库。
4:jar包的寻找过程:执行pom.xml—>本地资源库寻找—>私人资源库寻找—>中央资源库寻找
5:Maven资源库配置:进入maven安装目录/conf/ ,编辑 settting.xml:
本地仓库:<localRepository>:表示本地库的保存位置,也就是maven2主要的jar保存位置,默认在${user.dir}/.m2/repository,如果需要另外设置,就换成其他的路径。
共享仓库:Mirrors 表示镜像库,指定库的镜像,用于增加其他库(私库、远程库)
3.配置仓库
配置本地仓库路径
找到settings.xml 49行左右,有注释版的本地仓库配置示范,我们删除注释括号,修改内容进行配置。
<localRepository>/path/to/local/repo</localRepository>
配置镜像仓库
找到146行左右,有注释版的镜像仓库配置示范,我们删除注释括号,修改内容进行配置。
<mirrors>
<mirror>
<id>mirrorId</id>
<mirrorOf>是谁的镜像,如果是中央仓库的镜像就写central,如果是一切仓库的镜像就写*</mirrorOf>
<name>镜像仓库名</name>
<url>镜像仓库url</url>
</mirror>
</mirrors>
2.项目构建过程
项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这几个步骤,这六个步骤就是一个项目的完整构建过程。
3.Maven的生命周期
1.Maven三套生命周期
Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。
1、clean生命周期:清理项目,包含三个phase。
1)pre-clean:执行清理前需要完成的工作
2)clean:清理上一次构建生成的文件
3)post-clean:执行清理后需要完成的工作
2、default生命周期:构建项目,重要的phase如下。
1)validate:验证工程是否正确,所有需要的资源是否可用。
2)compile:编译项目的源代码。
3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
4)Package:把已编译的代码打包成可发布的格式,比如jar。
5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
6)verify:运行所有检查,验证包是否有效且达到质量标准。
7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
8)Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
3、site生命周期:建立和发布项目站点,phase如下
1)pre-site:生成项目站点之前需要完成的工作
2)site:生成项目站点文档
3)post-site:生成项目站点之后需要完成的工作
4)site-deploy:将项目站点发布到服务器
2.lifecycle phase goal 概念介绍
1.lifecycle:生命周期
lifecycle:生命周期,这是maven最高级别的的控制单元,它是一系列的phase组成,也就是说,一个生命周期,就是一个大任务的总称,不管它里面分成多少个子任务,反正就是运行一个lifecycle,就是交待了一个任务,运行完后,就得到了一个结果,中间的过程,是phase完成的,自己可以定义自己的lifecycle,包含自己想要的phase
常见的lifecycle有 | clean | package ear | pageage jar | package war | site等等
2.phase
可以理解为任务单元,lifecycle是总任务,phase就是总任务分出来的一个个子任务,但是这些子任务是被规格化的,它可以同时被多个lifecycle所包含,一个lifecycle可以包含任意个phase,phase的执行是按顺序的,一个phase可以绑定很多个goal,至少为一个,没有goal的phase是没有意义的
3.goal
这是执行任务的最小单元,它可以绑定到任意个phase中,一个phase有一个或多个goal,goal也是按顺序执行的,一个phase被执行时,绑定到phase里的goal会按绑定的时间被顺序执行,不管phase己经绑定了多少个goal,你自己定义的goal都可以继续绑到phase中
4.mojo
lifecycle与phase与goal都是概念上的东西,mojo才是做具体事情的,可以简单理解mojo为goal的实现类,它继承于AbstractMojo,有一个execute方法,goal等的定义都是通过在mojo里定义一些注释的anotation来实现的,maven会在打包时,自动根据这些anotation生成一些xml文件,放在plugin的jar包里
3.命令行和生命周期
各个生命周期相互独立,一个生命周期的阶段前后依赖。
举例如下:
1、mvn clean
调用clean生命周期的clean阶段,实际执行pre-clean和clean阶段
2、mvn test
调用default生命周期的test阶段,实际执行test以及之前所有阶段
3、mvn clean install
调用clean生命周期的clean阶段和default的install阶段,实际执行pre-clean和clean,install以及之前所有阶段
4.生命周期插件
Maven的不同生命周期中的操作,是通过插件来完成的。我们可以在pom.xml通过
具体的插件在Maven官网可以找到:http://maven.apache.org/plugins/index.html
在pom.xml中使用插件的格式:
<build>
<plugins>
<plugin>
<!--通过坐标指定插件-->
<groupId> </groupId>
<artifactId> </artifactId>
<version> </version>
<!--配置插件的使用阶段——在哪个生命周期被执行,执行的目标是什么-->
<executions>
<execution>
<phase>执行的生命周期</phase>
<goals>
<goal>插件的运行结果,Maven官网中该插件的说明找<goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
4.Maven元素解析——pom.xml
一个pom.xml中包含了许多标签,各个标签是对项目生命周期、依赖管理的配置。常用的主要有:
1:peoject:pom.xml的根标签,一个maven项目用一对
2:modelVersion:maven的版本
3:当前项目的坐标以及打包方式:
<groupId>:企业网址反写+项目名
<artifactId>:项目名-模块名
<version>:版本号+类型
版本号由三个整数表示,每个整数用“.”分隔,表示:大版本号.分支版本号.小版本号
类型:版本类型。主要有:snapshot快照版本(简化版本)、alpha内测版、beta公测版、release稳定版、GA正式发布版
<packaging>:打包类型,默认是jar,可以配置成war、zip、pom类型。
4:name:当前项目名
5:url:项目地址
6:description:项目描述信息
7:developers:开发者信息
8:licenses:项目许可证信息,用来发布时授予别人使用此项目的权利
9:organization:组织信息,企业信息
以上都是对这个maven项目的相关信息配置。
10:properties:属性值标签,也叫变量标签。与Ant中的property一样,可以通过这个标签包含一些属性并指定属性值。那么在pom.xml的其他地方,可以通过EL表达式访问变量的方法——${属性名} 来获取具体的属性值。一般这个用来作为整个pom.xml中需要重复使用的内容或者全局变量使用。
11:依赖标签
<dependencies>
<!--一个依赖包-->
<dependency>
<!--通过坐标指定依赖包-->
<groupId> </groupId>
<artifactId> </artifactId>
<version> </version>
<!--可选项:依赖范围。有六个可选值:常用compile/provided/test/runtime等-->
<scope>一个范围</scope>
<!--可选项:排除依赖传递:即:当前项目依赖当前配置的依赖包A时,如果这个依赖包又依赖其他包B,这里可以选择排除依赖的传递性,不下载导入B-->
<exclusions>
<exclusion>
<!--被排除的依赖包坐标-->
<groupId> </groupId>
<artifactId> </artifactId>
<version> </version>
</exclusion>
</exclusions>
</dependency>
</dependencies>
12:依赖管理标签:主要用于制定父pom.xml,其他项目可以继承这个pom.xml,从而避免重复定义某些depency。
<depencyManagement>
<depencies>
<depency>
依赖包的坐标...
</depency>
</depencies>
</depencyManagement>
13:build:项目支持标签,一般用来引入插件
<build>
<plugins>
<plugin>
<!--插件坐标-->
<groupId> </groupId>
<artifactId> </artifactId>
<version> </version>
其他设置...
</plugin>
</plugins>
</build>
14:parent:继承标签,用于继承父项目。
15:moudules:聚合标签,用于聚合多个maven项目,这样用某指令执行这个pom就会把聚合的各项目全部执行,同时处理多个项目。
示例:一个简单的构建JavaWeb项目的pom.xml如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>WebApp</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>WebApp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<!--commons-io为commons-fileupload的可选依赖包-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<finalName>WebApp</finalName>
</build>
</project>