四、仓库
4.1 仓库概念
- 存储依赖的地方,体现形式就是本地的一个目录。
- 仓库中不仅存放依赖,而且管理着每个依赖的唯一标识(坐标),Java项目凭坐标获取依赖。
4.2 仓库分类
Maven仓库可以分为本地仓库和远程仓库,其中远程仓库又分为中央仓库、公共仓库和私服
- 本地仓库: 本地仓库存放着项目中所需jar文件
- 中央仓库: Maven的中央仓库是由Maven社区提供存储jar文件的仓库
- 公共仓库: 国内厂家提供的存储jar文件的仓库,比如:aliyun仓库
- 私服: 由公司创建的存储jar文件的仓库,可在公司范围内共享,不对外开放
当项目中需要jar文件依赖时,会从仓库中查找获取,如果我们把所有仓库都配置好。maven在查找获取依赖的时候遵循一个依赖查找顺序,如下:(如果本地仓库找不到依赖就去私服下载,以此类推......)
依赖查找顺序: 本地仓库 - > 私服 - > 公共仓库 - > 中央仓库
4.3 本地仓库
本地仓库: 本地目录中存放所需jar包,需修改
settings
配置文件来配置本地仓库
- 使用过的依赖都会存储在本地仓库中,实现复用
4.4 远程仓库
4.4.1 中央仓库
中央仓库: Maven中央仓库是由Maven社区提供的仓库,不用任何配置,maven中内置了中央仓库地址。其中就包含绝大多数流行的开源Java构件
- https://mvnrepository.com/可以搜索需要的依赖的相关信息(仓库搜索服务)
- http://repo.maven.apache.org/maven2/为中央仓库地址
4.4.2 公共仓库
公共仓库: 第三方维护的jar文件仓库,比如阿里云提供的仓库。但是jar文件可能不如官方的中央仓库全,有时候也会找不到,所以如果项目构建不成功,可以更改镜像为官方的,下载完jar包再去改回来
aliyun仓库地址:http://maven.aliyun.com/nexus/content/groups/public/
因为Maven社区提供的中央仓库在国外,国内使用下载依赖速度过慢,所以一般我们都配置国内的公共仓库来代替中央仓库
使用时,需要在
settings.xml
配置文件中添加配置信息。打开settings.xml
配置文件,找到<mirrors>标签,你也会发现这是一个空标签,最后标签内填写如下配置就OK!
<!--setting.xml中添加如下配置--> <mirror> <id>aliyun</id> <!-- 中心仓库的 mirror(镜像) --> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库--> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
4.4.3 私服
私服: 公司创建存储jar文件的仓库,只对公司范围共享,不对外开放。可以通过
Nexus
来创建、管理一个私服。
4.4.3.1 私服概念
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。
有了私服之后,当 Maven 需要下载依赖时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。
私服可以解决在企业做开发时每次需要的jar包都要在中心仓库下载,且每次下载完只能被自己使用,不能被其他开发人员使用
所谓私服就是一个服务器,但是不是本地层面的,是公司层面的,公司中所有的开发人员都在使用同一个私服
4.4.3.2 私服架构
我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。这里我们使用
Sonatype Nexus
- 我们可以在图中得到在无私服的情况下,我们都需要从远程仓库去获取jar文件并存储在本地仓库,由于中央仓库是国外的,所以下载速度比较慢等等原因,并存在很多缺点,比如我们公司内使用
- 我们在图中可清晰的看到,如果有私服的话,我们需要从私服中,查找jar文件,如果私服没有该jar文件,就需要去中央仓库或公共仓库去下载,然后传到私服中,最后传入到自己的本地仓库进行使用。假设公司员工再一次使用到该jar文件,它会先从私服中找有没有这个jar文件,由于我们之前的员工已经将该jar文件存储到了私服中,所以就省去了其他员工调用远程仓库的步骤。并且私服是公司内部局域网类型的,下载速度会比远程仓库快出很多倍
无私服 | 有私服 |
---|---|
4.4.3.3 Nexus安装(了解即可)
下载我们需要下载Zip解压包即可,将解压包解压到本地盘符中即可!
解压后,你会看到nexus目录为私服目录,sonatype-work目录中包含存储私服下载的依赖。
4.4.3.4 Nexus登录
访问私服:http://localhost:8081/nexus/
登录私服的账号为
admin
,密码为admin123
4.4.3.5 仓库列表
仓库类型 | 描述 |
---|---|
group | 包含多个仓库,通过group库的地址可以从包含的多个仓库中查找构件 |
hosted | 私服 服务器本地的仓库,其中存储诸多构件 |
proxy | 代理仓库,其会关联一个远程仓库, 比如中央仓库,aliyun仓库,向该仓库查找构件时,如果没有会从其关联的仓库中下载 |
仓库名 | 描述 |
---|---|
Releases | 存放项目的稳定发布版本,一个模块做完后如果需要共享给他人,可以上传到私服的该库 |
Snapshots | 对应不稳定的发布版本 |
3rd party | 存放中央仓库没有的 ,如ojdbc.jar,可以上传到私服的该库中 |
仓库列表 |
---|
4.4.3.6 仓库组
而此时就有问题,私服中有很多仓库,每个仓库都有自己的url,则项目中配置哪个仓库呢 ?
私服中有一个仓库组,组中包含多个仓库,可以指定仓库组的url,即可从多个仓库中获取构件
关于仓库的设置: 由于我们在使用私服的时候,本地仓库没有的jar文件,需要去私服找,私服没有的话,就去中央仓库找。所以我们需要把私服内的中央仓库换为阿里云仓库,这样可以保证我们国内的下载速度。
仓库组 注意:proxy的仓库排序在最后 |
---|
4.4.3.7 手动上传仓库
4.4.3.8 Maven关联私服
配置
settings.xml
,设置私服地址、认证等信息(关联私服需要添加配置文件信息如下,找到父标签,添加子标签内容即可)
<servers> <server> <id>nexus-public</id> <!-- nexus的认证id --> <username>admin</username> <!--nexus中的用户名密码--> <password>admin123</password> </server> </servers>
<profiles> <profile> <id>nexus</id> <repositories> <repository> <id>nexus-public</id> <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】--> <!--name随便--> <name>Nexus Release Snapshot Repository</name> <!--地址是nexus中仓库组对应的地址--> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <!--插件仓库地址,各节点的含义和上面是一样的--> <pluginRepository> <id>nexus-public</id> <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】--> <!--地址是nexus中仓库组对应的地址--> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>yourjdk</activeProfile> <!-- 使私服配置生效 --> <activeProfile>nexus</activeProfile> </activeProfiles>
4.4.3.9 Meven项目部署到私服
- 执行
mvn deploy
指令即可将项目部署到私服对应的仓库中,此时项目中的打包方式多为jar- 但需要提前在项目的
pom.xml
中配置部署私服仓库位置,如下:注意: 如上的 repository的 id 依然是要和settings.xml中配置的server中的id 一致,才能通过私服的认证
<project> ... <dependencies> ..... </dependencies> <!-- 在项目的pom.xml中 配置私服的仓库地址,可以将项目打jar包部署到私服 --> <distributionManagement> <repository> <id>nexus-public</id> <!-- nexus认证id --> <url>http://localhost:8081/nexus/content/repositories/releases</url> </repository> <snapshotRepository> <id>nexus-public</id> <!-- nexus认证id --> <url>http://localhost:8081/nexus/content/repositories/snapshots</url> </snapshotRepository> </distributionManagement> </project>