暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Maven仓库

922

仓库

文件坐标

仓库中文件的索引路径是根据坐标数据确定的,在发布文件时逻辑类似

<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,当然这个包在中央仓库并不存在。

仓库类型

拉取依赖先在本地仓库搜索,找不到就会到远程仓库搜索,搜索不到就报错。远程仓库取决于自己的配置。
仓库.png

  1. 本地仓库

配置文件修改本地仓库标签指定bending仓库路径

<localRepository>D:\jenviorment\apache-maven-3.8.6\repo</localRepository>

将项目打包发布到本地仓库

mvn clean install
  1. 远程仓库

远程仓库存储所有依赖,更方便共享。

  1. 中央仓库

官方仓库,默认的远程仓库,包含绝大多数的依赖。

  1. 私服

私服是一种特殊的远程仓库,架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的maven用户使用。

当Maven下载构建时,从私服请求,私服不存在就会从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。

可以将一些外部远程库没有的包放在私服上,以便共享使用。

私服.png

私服的好处:

  1. 节省自己的外网带宽
  2. 加速Maven的构建
  3. 部署第三方构件
  4. 提高稳定性,增强控制,减少依赖外部远程仓库。
  5. 降低中央仓库的负荷。

使用远程仓库

配置远程

在默认的中央仓库无法满足要求的情况下,可以在项目的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,分析的元信息数据

  1. 依赖范围是system时,直接从systemPath指定路径解析构件

  2. 根据坐标地址,从本地仓库寻找构件,如果发现构件则解析成功

  3. 在本地仓库不存在构件的情况下,就会到远程仓库寻找:

    • 依赖的版本号是显式的版本号,如:1.2,2.1-beta-1等,则遍历所有的远程仓库,发现后下载。

    • 依赖的版本号是RELEASE或者LATEST,则基于更新策略读取远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地的对应元数据合并,计算出对应的RELEASE或者LATEST的值,然后基于该值从本地或者远程仓库下载。这种方式不推荐。在新版maven中一般没人这么用,LATEST好像在元信息中也没了。

      RELEASE:最新发布版本

      LATEST:最新版本,包含快照版本

    • 依赖的版本是SNAPSHOT,合并所有远程仓库和本地仓库的metadata.xml数据,得到最新的快照版本的值,然后基于该值从本地或者远程仓库下载。

  4. 如果最后解析得到的构件是时间戳格式的快照,,如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就无法正常工作了。

仓库依赖搜素

Maven Repository-首选

Nexus Repository Manager

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论