maven作为构建工具,在现在的项目中应用的很广泛,个人觉得它上手很快,而且maven的约定是很符合大部分项目的结构的。
下面主要介绍下maven的基本概念。
1、坐标和依赖
坐标:groupID,artifactID,version是必须的,packaging是可选的,默认是jar。
groupID:maven项目隶属的实际项目。例如:org.springframework
artifactID:maven项目名。例如:spring-core
version:maven项目的版本号。例如:4.0.2.RELEASE。(这个是稳定的版本号,还有一中快照的版本号,是在平时还在开发过程中的项目用到的,因为它的不稳定性,一般不建议用来被其他项目依赖。)
packaging:maven项目的打包方式。目前常见的有三种打包方式:jar、war、pom。pom一般用在聚合和继承的maven项目中,为了更好的管理依赖的jar包。
classifier:暂未用到过。
依赖
groupID,artifactID,version:依赖的基本坐标,根据基本坐标才能找到唯一的依赖。
type:依赖类型,对应坐标的packaging,默认也是jar。
scope:依赖范围。
optical:标记依赖是否可选。
exclusions:用来排除传递依赖。
依赖范围
依赖范围 | 编译有效? | 测试有效? | 运行有效? | 例子 |
---|---|---|---|---|
compile | Y |
Y |
Y |
spring-core |
test | Y |
Junit |
||
provided | Y |
Y |
servlet-api |
|
runtime | Y |
Y |
JDBD驱动实现 |
|
system | Y |
Y |
本地类库 |
除上述依赖范围外,还有一个依赖范围:import,这个依赖范围只能用在依赖配置(dependencyManagement)中,不能用在依赖(dependency)中。
依赖传递
A依赖于B,B依赖于C,A对B是第一直接依赖,B对C是第二直接依赖,A对C是传递性依赖。
第一依赖\第二依赖 | compile | test | provided | runtime |
---|---|---|---|---|
compile | compile |
runtime |
||
test | test |
test |
||
provided | provided |
provided |
provided |
|
runtime | runtime |
runtime |
注:system为本地依赖,传递不了。
依赖调解
因为有传递依赖,可能一个依赖被依赖多次,版本号也有可能不一致,基于此,所以maven有默认的依赖调解机制。
依赖调解两大原则:1、路径最近者优先;2、第一声明者优先。
可选依赖(基本不用)
如果A依赖于B,B可选依赖于C,A不会依赖于C。
排除依赖
如果A依赖于B,B依赖于C,A不想要C的传递依赖,可在A依赖于B的配置中加入排除C的依赖即可。
归类依赖(常用)
例如maven的properties属性定义一些全局的变量(例如Spring的版本号),在依赖的时候引用定义的全局属性值即可,在版本一致时常用,版本升级时方便。
2、maven仓库
maven寻找构建的时候,会先到本地仓库去查找,如果本地仓库存在,会直接使用;如果不存在或者需要查看是否有更新的版本(例如快照版本的依赖),maven就会去远程仓库找,找到以后现在到本地仓库,在使用此构建;如果本地和远程都没有找到的话,就会报错。
maven仓库分为本地仓库和远程仓库,远程仓库分为中央仓库,私服和其他公共类库。
本地仓库的路径一般是C:\Users\[用户名]\.m2\repository,也可以通过修改settings.xml文件里【localRepository】的值来改变本地仓库的路径,IDE中可以通过配置M2_REPO的值来改变maven本地仓库地址,不过一般不建议在IDE中用maven。
中央仓库默认是在超级pom中定义的,maven2中的超级pom定义在文件路径类似于M2_HOME/lib/maven-2.2.1-uber.jar里,maven3中超级pom的定义在文件路径类似于M2_HOME/lib/maven-model-builder-3.2.3.jar里。远程仓库是以ID为唯一标识的,中央仓库的ID是central,如果在配置一个仓库ID为central的仓库,就会覆盖掉之前的中央仓库的配置。
3、生命周期与插件
maven的生命周期是对所有构建过程的抽象和统一。几乎包含了所有的构建步骤:清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等。
maven有三套独立的生命周期:clean生命周期,default生命周期,site生命周期。
clean生命周期:主要目的是清理项目。包括pre-clean、clean、post-clean三个阶段。
default生命周期:项目构建时所需要执行的步骤。
包括以下阶段:validate、initialize、generate-sources、process-sources、generate-resources、process-resources、compile、
process-classes、generate-test-sources、process-test-sources、generate-test-resources、process-test-resources、test-compile、
process-test-classes、test、prepare-package、package、pre-integration-test、integration-test、post-integration-test、verify、install、deploy。
site生命周期:目的是建立和发布项目站点。包括pre-site、site、post-site、site-deploy。
例:mvn clean install命令就是调用clean生命周期的clean阶段,然后调用default生命周期的install阶段。
maven的生命周期是抽象的,本身并不做实际的事情,实际的事情全部是交由插件的完成的。
生命周期与插件的绑定是通过插件目标绑定的,一个插件可以有多个插件目标。一个插件目标就对应一个功能,可以通过命令行mvn 插件名:目标直接使用,也可以把插件目标绑定到生命周期的具体阶段。
maven不需要任何配置就能构建maven项目,因为maven为一些核心的生命周期阶段绑定了很多插件目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。
***内容参考《maven实战》