仓库
任何一个依赖、插件或者项目构建的输出都可以称为构件,任何一个构件都有唯一的坐标标识
仓库的布局
每个坐标对应唯一的存储路径
如:
1 | <groupId>com.company.project</groupId> |
存储路径为:com/company/project/hello-world/0.0.1-SNAPSHOT/hello-world-0.0.1-SNAPSHOT.extension
仓库的分类
- 本地仓库:用来存储从远程仓库下载的插件和jar包,当项目需要使用,插件或jar包时,优先从本地仓库查找
- 远程仓库:当项目需要使用插件或jar包时,本地仓库没有,则默认去远程仓库下载
本地仓库路径:
默认:.m2/repository
可修改setting.xml文件中的:
本地仓库只有一个,远程仓库可以由多个(至少一个)
远程仓库又可以根据用途分为:
- 中央仓库:Maven 工具内置了一个中央仓库地址,服务于整个互联网,由 Maven 团队自己维护,存储了几乎所有开源的 jar 包(中央仓库是远程仓库的默认仓库)
- 私服:私服是一种特殊的远程仓库,它是架设在局域网内的一台服务器,提供仓库服务,用来代理所有外部的远程仓库
- 镜像仓库:镜像仓库就是其它的公共仓库
私服有什么作用?
- 节省外网宽带:大量对于外网仓库的重复请求会消耗很大的带宽
- 加速Maven构建:maven一些内部机制(如快照更新检查)要求Maven在构建时不停的检查远程仓库数据,这会大大的降低构建的速度,使用私服可以很好的解决这个问题。
- 部署三方构件:一般可能是公司私有的构件,不希望公开
- 提高稳定性,增强控制:当外网不稳定时,私服作为局域网,也可正常构建。另外,一些私服软件(如Nexus)还提供了很多额外的功能:如权限控制,RELEASE/SNAPSHOT区分。
- 降低中央仓库的负荷
远程仓库的配置
默认的中央仓库配置在超级POM包中:
1 | <repositories> |
在pom.xml中配置远程仓库:
1 | <repositories> |
大部分的远程仓库无需认证即可访问,但有时处于安全考虑,需要认证才可访问,大部分私服都是如此
认证信息只能配置在setting.xml文件中:
1 | <servers> |
部署到远程仓库
配置部署地址:
1 | <distributionManagement> |
快照版本
为什么要区分发布版和快照版?
当项目A和B同时开发,而B依赖A时,B如何做到及时更新A的最新版本?
方案1:B的开发者每次自己去构建A的最新版本,并引入依赖
方案2:A的开发者重新部署,B的开发者删除本地依赖后重新引入构件
方案3:每次都更新一个新的版本
很显然上面3个方案都很繁琐
因此引入快照版本:xxx-SNAPSHOT表示快照,A构建时Maven会将当前替换为当前的时间戳,再进行部署。之后B每次构建时Maven会自动去检查更新(默认每天一次),并进行替换。
快照版本只应该在组织内部使用,使用外部的快照版本会很危险。
除了快照版本,还有:
- RELEASE:表示最新发布版本
“最新”是基于gruopId/artifactId/maven-metadata.xml检查更新的
“快照”是基于gruopId/artifactId/version/maven-metadata.xml检查更新的
镜像
如果仓库X可以提供仓库Y存储的所有内容,那么认为X是Y的一个镜像。
镜像的配置:
1 | <mirror> |
- mirrorOf:任何对于中央仓库的请求都会转至该镜像
仓库搜索服务
如何根据项目的名称去搜索响应的Maven坐标?
- Sonatype Nexus:Nexus提供了关键字搜索,类名搜索,左边搜索,校验和搜索等功能。
- Jarvana:Jarvana还提供了便捷的Java文档浏览的功能。
- MVNbrowser:只提供关键字搜索的功能。能够告诉用户该构件的依赖于其他那些构件(Dependencies)以及该构件给哪些其他构件依赖(Referenced By)