什么是Maven仓库
Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务。仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。得益于 Maven 的坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的,Maven可以在某个位置统一存储所有的Maven项目共享的构件,这个统一的位置就是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。
说人话就是Maven仓库是通过坐标机制存储对应的构件,并且可以通过坐标机制查找到对应的构建,并且我们自己构建的构件也可以上传到Maven仓库中(只要权限足够)。
Maven使用坐标机制
为了解决我们配置文件时如何精确地查到正确的依赖构件,Maven引入了坐标机制来唯一的确定每一个构件。坐标机制通过三个向量来唯一确定所需构件,分别是:
- groupId:定义当前Maven组织名称
- artifactId:定义实际项目名称
- version:定义当前项目的当前版本
pom文件中添加依赖配置如下所示:
<!-- 三个向量坐标定位 --> <dependency> <groupId>xxxxxx</groupId> <artifactId>xxxxxx</artifactId> <version>xxxxxx</version> </dependency>
Mavan仓库类型
Maven存放构件的仓库分两种:本地仓库和远程仓库。
Maven寻找构件的时候,先查看本地仓库,如果本地仓库存在坐标对应的构件,就直接使用。如果本地仓库不存在所需要的构件,或者需要查看是否有更新的构件版本,Maven 就会去远程仓库查找,发现需要的构件后,下载到本地仓库后使用,如果本地仓库和远程仓库都没有找到需要的构件,Maven就报错。
本地仓库
一般情况下我们安装完Maven之后如果没有配置setting文件,则默认的本地仓库地址就是~/.m2/repository。
如果我们需要修改地址仓库地址的话,可以通过修改setting文件的<localRepository>标签即可。
<localRepository>${u}/.m2/repository</localRepository>
远程仓库
远程仓库分为三种:中央仓库、其他仓库和私服
中央仓库是由Maven社区提供的仓库,其中包含了大量常用的库,基本涵盖了我们所需要的所有开源构件。下面是中央仓库的配置(同时配置了插件和依赖仓库):
<repositories> <repository> <id>central</id> <name>Central Repository</name> <url>;/url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <name>Central Repository</name> <url>;/url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories>
私服
私服是一个特殊的远程仓库,架设在局域网内。它是一个代理外网的远程仓库,供局域网内部的Maven用户使用。一般情况下远程仓库都是使用Nexus部署,私服也是一样的。在Nexus中有三种仓库类型:
- 远程代理仓库【Proxy】:本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
- 宿主仓库【Hosted】:它们被用来代理远程的公共仓库,如maven中央仓库。
- 仓库组【Group】:用来合并多个hosted/proxy仓库,当你的项目希望在多个Repository使用资源时就不需要多次引用了,只需要引用一个group即可。
私服的使用重要有以下几个优点:
- 节省外部带宽:获取一个特定构件,一个局域网只要请求一次即可,不用每个用户都请求中央仓库或者第三方仓库;
- 提高Maven的效率:访问很多外部仓库,特别是中央仓库网络是比较差的,直接使用私服,因为是内部网络,速度会快很多;
- 便于部署第三方构件:如果某个构件仅限内部使用,没有私服相对会比较麻烦。有了私服,可以将它们部署到私服中,这样局域网内的Maven用户就可以使用该构件了;
- 提高Maven的稳定性,更方便控制管理:外部的仓库有可能出现断网,停服务以及其他安全风险(权限控制等等);
- 降低中央仓库的负荷压力