仓库
文件坐标
仓库中文件的索引路径是根据坐标数据确定的,在发布文件时逻辑类似
<dependency>
<groupId>com.junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!--发布时取packaging-->
<type>war</type>
<!--附属构建选择-->
<classifier>jdk8</classifier>
</dependency>
上面的依赖解析成仓库的路径为:com/junit/junit/3.8.1/junit-3.8.1-jdk8.war,当然这个包在中央仓库并不存在。
仓库类型
拉取依赖先在本地仓库搜索,找不到就会到远程仓库搜索,搜索不到就报错。远程仓库取决于自己的配置。

- 本地仓库
配置文件修改本地仓库标签指定bending仓库路径
<localRepository>D:\jenviorment\apache-maven-3.8.6\repo</localRepository>
将项目打包发布到本地仓库
mvn clean install
- 远程仓库
远程仓库存储所有依赖,更方便共享。
- 中央仓库
官方仓库,默认的远程仓库,包含绝大多数的依赖。
- 私服
私服是一种特殊的远程仓库,架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的maven用户使用。
当Maven下载构建时,从私服请求,私服不存在就会从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。
可以将一些外部远程库没有的包放在私服上,以便共享使用。

私服的好处:
- 节省自己的外网带宽
- 加速Maven的构建
- 部署第三方构件
- 提高稳定性,增强控制,减少依赖外部远程仓库。
- 降低中央仓库的负荷。
使用远程仓库
配置远程
在默认的中央仓库无法满足要求的情况下,可以在项目的POM中配置远程另外一个远程仓库
<repositories>
<!--可以配置多个远程仓库-->
<repository>
<!--不同的远程仓库的id不一样,重要-->
<id>jboss-public-repository-group</id>
<name>JBoss Public Maven Repository Group</name>
<!--下载地址,重要-->
<url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
<!--代表maven2或者maven3的布局-->
<layout>default</layout>
<!--稳定版构件下载-->
<releases>
<!--下载,false不下载-->
<enabled>true</enabled>
<!--从远程仓库检查更新的频率,默认daily-->
<updatePolicy>daily</updatePolicy>
<!--构件下载校验策略,默认warn-->
<checksumPolicy>warn</checksumPolicy>
</releases>
<!--快照版构件下载-->
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
</repositories>
认证远程仓库
有些远程仓库出于安全考虑,需要提供认证信息才能访问。配置用户名密码/密钥认证等。
认证信息必须配置在setting.xml配置文件中。
<!--此处的id对应项目中pom文件配置的repository的id-->
<servers>
<!--用户名密码认证-->
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
<!--密钥验证-->
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>optional; leave empty if not used.</passphrase>
</server>
</servers>
部署至远程仓库
想要将项目输出的构建部署到指定的远程仓库,需要在POM文件中配置distibutionManagement标签
<distributionManagement>
<!--稳定版仓库配置-->
<repository>
<!--仓库id-->
<id>my-repo-release</id>
<name>my test repo release</name>
<!--仓库地址-->
<url>http://192.168.0.1/content/repositories/repo-release</url>
<layout>default</layout>
</repository>
<!--快照版仓库配置-->
<snapshotRepository>
<id>my-repo-snapshot</id>
<name>my test repo snapshot</name>
<url>http://192.168.0.1/content/repositories/repo-snapshot</url>
<layout>default</layout>
</snapshotRepository>
</distributionManagement>
其中配置的远程仓库需要的认证和上方的认证配置一样,最后就是在项目构件的时候执行部署命令
mvn clean depoly
快照版本
Maven的快照版本有一个快照版本机制。解决在被依赖的项目持续开发更新的问题。被依赖的项目发布版本到快照仓库,版本号为2.1-SNAPSHOT,maven在构建部署时会自动给快照加上时间戳。
如20221014.221010-13,表示2022年10月10日22时10分10秒的第13次快照,这样,构建的项目和依赖的项目只需要在pom中使用快照版本号即可,maven在下载依赖的时候会自动更新时间戳寻找最新的快照版本,而且通过仓库配置可以配置更新频率updatePolicy标签
快照版本只应该在私服中使用,项目不应该依赖任何外部第三方的快照版本
仓库解析依赖的机制
maven版本3.5.3,分析的元信息数据
-
依赖范围是system时,直接从systemPath指定路径解析构件
-
根据坐标地址,从本地仓库寻找构件,如果发现构件则解析成功
-
在本地仓库不存在构件的情况下,就会到远程仓库寻找:
-
依赖的版本号是显式的版本号,如:1.2,2.1-beta-1等,则遍历所有的远程仓库,发现后下载。
-
依赖的版本号是RELEASE或者LATEST,则基于更新策略读取远程仓库的元数据
groupId/artifactId/maven-metadata.xml,将其与本地的对应元数据合并,计算出对应的RELEASE或者LATEST的值,然后基于该值从本地或者远程仓库下载。这种方式不推荐。在新版maven中一般没人这么用,LATEST好像在元信息中也没了。RELEASE:最新发布版本
LATEST:最新版本,包含快照版本
-
依赖的版本是SNAPSHOT,合并所有远程仓库和本地仓库的metadata.xml数据,得到最新的快照版本的值,然后基于该值从本地或者远程仓库下载。
-
-
如果最后解析得到的构件是时间戳格式的快照,,如
1.4.1-20221014.221010-13,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用非时间戳格式的构件。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
</dependency>
上面依赖是hutool的包依赖,会自动导入最新的发布版本5.8.8,对应的版本信息在本地仓库的cn/hutool/hutool-all目录下,版本元信息保存在文件maven-metadata-aliyunmaven.xml中,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.9</version>
<versioning>
<release>5.8.8</release>
<versions>
<version>4.0.0</version>
<version>4.0.1</version>
<version>4.0.2</version>
......
<version>5.8.7</version>
<version>5.8.8</version>
</versions>
<lastUpdated>20220926153352</lastUpdated>
</versioning>
</metadata>
maven中导入插件时显式指定版本时,就是RELEASE,可能有风险。
对于一些快照版本的打包的元信息就如下,路径com\xrj\spring-test\maven-metadata-local.xml:
release只有在发布了
0.0.2这种发布的版本号才会出现
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.xrj</groupId>
<artifactId>spring-test</artifactId>
<versioning>
<release>0.0.2</release>
<versions>
<version>0.0.1-SNAPSHOT</version>
<version>0.0.2-SNAPSHOT</version>
<version>0.0.2</version>
</versions>
<lastUpdated>20221014143911</lastUpdated>
</versioning>
</metadata>
对于后缀为SNAPSHOT的快照版本,在对于的版本依赖路径下有对应的依赖元信息,以0.0.2-SNAPSHOT为例,只安装到了本地仓库,文件路径是com\xrj\spring-test\0.0.2-SNAPSHOT\maven-metadata-local.xml:
<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1.0">
<groupId>com.xrj</groupId>
<artifactId>spring-test</artifactId>
<version>0.0.2-SNAPSHOT</version>
<versioning>
<snapshot>
<localCopy>true</localCopy>
</snapshot>
<lastUpdated>20221014143911</lastUpdated>
<snapshotVersions>
<snapshotVersion>
<extension>jar</extension>
<value>0.0.2-SNAPSHOT</value>
<updated>20221014143911</updated>
</snapshotVersion>
<snapshotVersion>
<extension>pom</extension>
<value>0.0.2-SNAPSHOT</value>
<updated>20221014143911</updated>
</snapshotVersion>
</snapshotVersions>
</versioning>
</metadata>
只有快照版本才有对应版本的元信息文件,每次同一版本号构件都会更新成最新的信息。
发布版本就没有对应的元信息文件,每次同一版本构件发布就会直接覆盖原有构件。
镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。
镜像配置,在setting.xml中配置:
<mirrors>
<mirror>
<id>aliyunmaven</id>
<!--对于任何这里配置的仓库id的请求都会转到此镜像仓库,如此处的aliyunmaven仓库-->
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
mirrorOf标签的匹配规则:
<mirrorOf>*</mirrorOf>:匹配所有远程仓库,表示maven对所有远程仓库的请求都会转到镜像仓库。<mirrorOf>external:*</mirrorOf>:匹配所有不在本机的远程仓库,使用localhost和file://的镜像仓库除外。<mirrorOf>repo1,repo2</mirrorOf>:匹配repo1和repo2这两远程仓库,使用,分隔多个远程仓库。<mirrorOf>*,!repo1</mirrorOf>:匹配除了repo1之外的所有远程仓库,使用!排除特定远程仓库。
使用镜像仓库时,如果镜像仓库挂了,那么maven就无法正常工作了。




