04仓库

仓库

任何一个依赖、插件或者项目构建的输出都可以称为构件,任何一个构件都有唯一的坐标标识

仓库的布局

每个坐标对应唯一的存储路径

如:

1
2
3
4
<groupId>com.company.project</groupId>
<artifactId>hello-world</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hello maven</name>

存储路径为:com/company/project/hello-world/0.0.1-SNAPSHOT/hello-world-0.0.1-SNAPSHOT.extension

仓库的分类

  • 本地仓库:用来存储从远程仓库下载的插件和jar包,当项目需要使用,插件或jar包时,优先从本地仓库查找
  • 远程仓库:当项目需要使用插件或jar包时,本地仓库没有,则默认去远程仓库下载

仓库的分类

本地仓库路径:
默认:.m2/repository
可修改setting.xml文件中的:

D:\Java\Maven\repository

本地仓库只有一个,远程仓库可以由多个(至少一个)

远程仓库又可以根据用途分为:

  • 中央仓库:Maven 工具内置了一个中央仓库地址,服务于整个互联网,由 Maven 团队自己维护,存储了几乎所有开源的 jar 包(中央仓库是远程仓库的默认仓库)
  • 私服:私服是一种特殊的远程仓库,它是架设在局域网内的一台服务器,提供仓库服务,用来代理所有外部的远程仓库
  • 镜像仓库:镜像仓库就是其它的公共仓库

私服有什么作用?

  1. 节省外网宽带:大量对于外网仓库的重复请求会消耗很大的带宽
  2. 加速Maven构建:maven一些内部机制(如快照更新检查)要求Maven在构建时不停的检查远程仓库数据,这会大大的降低构建的速度,使用私服可以很好的解决这个问题。
  3. 部署三方构件:一般可能是公司私有的构件,不希望公开
  4. 提高稳定性,增强控制:当外网不稳定时,私服作为局域网,也可正常构建。另外,一些私服软件(如Nexus)还提供了很多额外的功能:如权限控制,RELEASE/SNAPSHOT区分。
  5. 降低中央仓库的负荷

私服

远程仓库的配置

默认的中央仓库配置在超级POM包中:

1
2
3
4
5
6
7
8
9
10
11
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

在pom.xml中配置远程仓库:

1
2
3
4
5
6
7
8
9
10
11
12
13
<repositories>  
<repository>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>http://maven.net.cn/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

大部分的远程仓库无需认证即可访问,但有时处于安全考虑,需要认证才可访问,大部分私服都是如此

认证信息只能配置在setting.xml文件中:

1
2
3
4
5
6
7
<servers>
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
</servers>

部署到远程仓库

配置部署地址:

1
2
3
4
5
6
7
8
9
10
11
12
<distributionManagement>
<repository>
<id>releases</id>
<name>public</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</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
2
3
4
5
6
<mirror>
<id>aliyunmaven</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>

  • mirrorOf:任何对于中央仓库的请求都会转至该镜像

仓库搜索服务

如何根据项目的名称去搜索响应的Maven坐标?

  1. Sonatype Nexus:Nexus提供了关键字搜索,类名搜索,左边搜索,校验和搜索等功能。
  2. Jarvana:Jarvana还提供了便捷的Java文档浏览的功能。
  3. MVNbrowser:只提供关键字搜索的功能。能够告诉用户该构件的依赖于其他那些构件(Dependencies)以及该构件给哪些其他构件依赖(Referenced By)

本文标题:04仓库

文章作者:Sun

发布时间:2020年01月13日 - 15:01

最后更新:2020年01月16日 - 16:01

原始链接:https://sunyi720.github.io/2020/01/13/Maven/04仓库/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。