Maven如何与Nexus和Artifactory等不同的存储库进行交互?
是否使用REST API完成?可以将依赖的工件解析为实际位置以使它们不能使用这些API,但这两个API在某种程度上彼此不同(据我所见[Artifactory] [Nexus])和存储库定义元素在Maven pom文件中不包含声明存储库类型的属性。
那么Maven如何将工件的groupId,artifactId和版本解析为不同存储库中的实际文件?这些存储库是否实现了一些其他标准化API,使Maven能够以与存储库无关的方式从它们请求文件?
答案 0 :(得分:1)
Maven使用某种命名约定。在pom.xml
中,您定义了存储库的根URL(例如http://download.java.net/maven/2/
),然后maven就可以通过构建URL来解析工件:
<root URL>/${group id where dots are replaced by slashes}/${artifact id}/${version}
所以对于以下依赖
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>2.0.0</version>
Maven将尝试在http://download.java.net/maven/2/org/apache/lucene/lucene-core/2.0.0
这意味着遵循此约定的每个URI都可以充当Maven仓库。
答案 1 :(得分:1)
Yoy定义存储库以两种方式搜索工件:
1)在项目部分的pom.xml中
<project>
....
<repositories>
<repository>
...
<url>...</url>
</repository>
</repositories>
</project>
2)和/或文件$USER_HOME$/.m2/settings.xml
(WEB上有很多例子)
Maven通过使用存储库URL构建工件的URL并根据工件组,id,版本,类型和分类器附加路径来下载工件。并将groupId中的点转换为'/'
RepoUrl/groupId/artifactId/version/artifactId-version-classifier.type
示例:
https://repository.apache.org/content/repositories/releases/commons-io/commons-io/2.4/commons-io-2.4.jar
https://repository.apache.org/content/repositories/releases/commons-io/commons-io/2.4/commons-io-2.4-sources.jar
https://repository.apache.org/content/repositories/releases/commons-io/commons-io/2.4/commons-io-2.4-javadoc.jar
这是惯例,它独立于Artifactory或Nexus。这是Maven。一切都通过HTTP或HTTPS传输。此外,Maven还出于安全目的处理MD5和SHA1文件。
下载后,工件存储在工作站的本地存储库中$USER_HOME$/.m2/repositories
(它具有类似于远程存储库的结构),充当缓存和代理。
通常,Artifactory或Nexus是公司级别的本地缓存和代理,具有一些管理它的功能。当然,他们会托管公司开发人员发布的maven工件。
看起来像3级存储库:本地 - 本地公司 - 全球
答案 2 :(得分:0)
maven使用普通的http调用与存储库进行交互。你不需要任何东西,只需要一个http服务器来提供maven存储库。 maven依赖于特定的目录层次结构和一些元数据文件。 (磁盘存储库中的本地磁盘存储库,它下载的maven缓存文件的格式完全相同)。