Maven概述
1. 什么是Maven
Maven是自动化构建工具和依赖管理工具
2. 为什么要使用Maven
一个项目大致经历编译、测试、打包、安装、部署这几个阶段,如果手动一步一步进行操作的话太浪费时间。
而使用Maven只需要很少的命令就能完成,当然,我们需要为这种方便牺牲一些自由,其实也就是遵守Maven的一些规范。
安装(install):将项目打成jar包,安装到本地Maven仓库,方便其他的项目使用。
部署(deploy):将war包部署到远程容器
3.Maven的目录结构
- Maven安装目录下,有bin,boot,conf,lib等目录,其中conf下的setting.xml,修改将作用于全局Maven行为
- 用户目录下的.m2目录下,通常只有repository和settings.xml两个文件,改settings.xml将作用于用户下的Maven项目;
而repository用于存放本地下载下来的maven构件。
Maven的依赖
1.pom.xml
POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
pom中的常见属性
<package>jar/pom/</package>//项目的打包类型,默认为jar
<dependencies>//项目的依赖
<dependency></dependencies>
</dependency>
依赖dependency的常见属性
groupId、artifactId和version:项目坐标
type:以依赖类型,默认为jar
scope:依赖范围
optional:是否可选
exclusions:排除传递依赖
2.Maven的坐标
为了便于确定构件在仓库中的唯一坐标,Maven引入groupId、artifactId、version、packaging、classifier属性。
groupId:该项目的实际隶属项目,而不是所属的组织。因为一个项目下有很多模块,若groupId定位到组织,则artifactId只能定位到项目,则无法定位模块。
例如SpringFramework这一实际项目下,有spring-core、spring-context等子模块。groupId一般与域名反向对应。(项目必须)artifactId:定义一个项目的模块,推荐将实际项目作为前缀。(项目必须)
packing:构建的打包方式,例如,nexus-indexer-2.0.0.jar与nexus-indexer-2.0.0.war是不同的构件。(可选)
classifier:定义附属构件,我们不能在项目中定义项目的classifier,通常为插件生成。附属文件通常为doc等,这样附属构件也有了他自己的坐标。(不能直接定义)
3.maven的依赖范围
在dependency中有一个scope属性,该属性表示依赖的作用范围,常见的有compile、test、runtime这几个值,当然也有不常见的provided和system。其中compile是默认值。
在编译、测试、运行时会使用不同的classpath,而不同值对classpath的影响如下:(Y表示在会加入此阶段classpath)
值 | 编译的classpath | 测试的classpath | 运行时的classpath |
---|---|---|---|
compile | Y | Y | Y |
test | N | Y | N |
provide | Y | Y | N |
runtime | N | Y | Y |
4. 依赖传递与依赖调解
maven会解析依赖的依赖,将符合条件的依赖引入当前项目。为保证构件在本项目有唯一的版本,在依赖调节过程中,遵循路径最短,同样路径下先声明先使用的原则。
依赖调节原则:
A->B->C(1.0),A->D->E->C(2.0),路径最短,将使用C(1.0)
A->B->C(1.0),A->D->C(2.0),先声明先使用,使用C(1.0)
符合条件的依赖:不是所有的依赖都会引入到当前项目,可选依赖将不会传递。举例:
<dependency>
<group>mysql</group>
<artifactId>mysql-connector-java</artifactId>
<vision>5.1.10</vision>
<optional>true</optional>//此依赖将不会被传递。只会被本项目(直接依赖)引入
</dependency>
传递依赖的依赖范围在本项目中的影响:(第一竖排表示第一直接依赖,第一横行表示第二直接依赖,表中结果表示在本项目中的依赖范围)
compile | test | provide | runtime | |
---|---|---|---|---|
compile | compile | - | - | runtime |
test | test | - | - | test |
provide | provide | - | provide | provide |
runtime | runtime | - | - | runtime |
若要排除依赖(排除一些回本项目有影响的快照以依赖版本),可使用exclusions属性。
5.查看依赖树
若要查看本项目的依赖情况,可使用如下命令
mvn dependency:list//显示本项目的所有依赖及其以依赖范围
mvn denpendency:tree//以层级的方式显示本项目中的所有依赖,层级:依赖路径长度