1、坐标
1.1、定义
在平面几何中,坐标可以标识平面中唯一的点;Maven中的坐标可以作为构件的唯一标识。
1.2、组成
- groupId:定义当前Maven项目隶属项目;
- artifactId:定义实际项目中的一个模块;
- version:定义当前项目的当前版本;
- packaging:定义该项目的打包方式;
1.3、使用坐标的理由
- Maven世界拥有大量的构建,我们需要找一个用来唯一标识一个构建的统一规范;
- 拥有了统一的规范,就可以把查找工作交给机器;
2、依赖管理
2.1、依赖管理-依赖范围
其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
- compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
- test:测试依赖范围。只对于测试classpath有效
- provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
- runtime:运行时提供。例如:jdbc驱动
2.2、如何进行依赖配置?
传递性依赖、可选依赖和排除依赖。
2.2.1、传递性依赖
若Two中使用One,Three中使用Two,则称Two是Three的直接依赖,One是Three的间接依赖;
也可表示为:
C->B B->A
C直接依赖B
C间接依赖A
2.2.2、可选依赖
... mysql-connector-java ... true/false
<optional>元素中的true/false,表示mysql-connector-java这个依赖是否为可选依赖;
2.2.3、排除依赖
... ...
exclusions可以包含一个或多个exclusion子元素,表示可以排除一个或多个可选性依赖;声明exclusion的时候也不需要version元素。
2.3、 依赖冲突
如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准(就近原则);
如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准(就近原则);
3、仓库
3.1、概念
首先介绍下构件的概念:任何一个依赖、插件或者项目构建的输出,就称为构件;那么 存储所有maven项目共享的构件的统一位置就是仓库。
3.2、布局方式
任何构件都有一个唯一的坐标,通过这个坐标可以定义其在仓库中的唯一存储路径
3.3、仓库的分类
仓库有两种,本地和远程仓库。maven根据坐标寻找构件的时候,首先会搜索本地仓库,若存在,直接使用;若不存在或需要查看是否有更新的构件版本,maven就去远程仓库查找,找到后就下载到本地仓库使用。若都没找到就会报错。
3.2.1、本地仓库
我的本地仓库的目录为 D:\Users\YUHUAN.m2\repository
一个构件只有在本地仓库中,才能由其他maven项目使用。有两种方法:
- 依赖maven从远程仓库下载到本地仓库
- 将项目的构件安装到maven仓库中,这种是最常见的方法
3.2.2、远程仓库
3.2.2.1、中央仓库
中央仓库是maven核心自带的远程仓库,包含了绝大多数流行的开源构件;当本地仓库没有项目所需要的构件的时候,会尝试从中央仓库下载。
3.2.2.2 私服
是一种特殊的远程仓库,是在局域网里架设一个私有的仓库服务器,用其代理所有的外部的远程仓库。内部的项目还能部署到私服上面供其他项目用。
3.3、镜像
若仓库A可以为仓库B提供其存储的所有内容,那么A是B的一个镜像;
对于内部的maven用户来说,可以使用一个私服地址来使用所需的外部仓库,这样将配置集中到私服,简化maven本身的配置。
一般在settings.xml文件里配置
nexus central 镜像仓库的地址
<mirrorOf>标签里的内容可为:
- central:代表该配置为中央仓库的镜像;
- *:代表匹配所有远程仓库;
- external:*:匹配所有不在本机上的远程仓库;
- repo1,repo2:匹配仓库repo1和repo2,多个远程仓库用逗号分隔;
- *,!repo1:匹配出repo1在内的所有远程仓库;