2

Maven 如何与 Nexus 和 Artifactory 等不同的存储库交互?

是使用他们的 REST API 完成的吗?可以将依赖工件解析到实际位置以使用这些 API 获取它们,但是这两个 API 彼此有些不同(据我所知[Artifactory] ​​[Nexus])和 Maven pom 文件中的存储库定义元素不包含用于说明存储库类型的属性。

那么 Maven 是如何将 artifact 的 groupId、artifactId 和 version 解析为不同存储库中的实际文件的呢?这些存储库是否实现了其他一些标准化 API,使 Maven 能够以与存储库无关的方式从它们请求文件?

4

3 回答 3

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 将尝试在以下位置找到 poms 和 jarhttp://download.java.net/maven/2/org/apache/lucene/lucene-core/2.0.0

这意味着遵循此约定的每个 URI 都可以用作 Maven 存储库。

于 2012-07-25T13:59:27.650 回答
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。这是马文。一切都通过 HTTP 或 HTTPS 传输。此外,Maven 出于安全目的处理 MD5 和 SHA1 文件。

下载后,工件存储在工作站上的本地存储库中$USER_HOME$/.m2/repositories(它的结构类似于远程存储库),充当缓存和代理。

通常,Artifactory 或 Nexus 是公司级别的本地缓存和代理,具有一些管理它的功能。当然,它们托管公司开发人员发布的 Maven 工件。

看起来像 3 级存储库:本地 - 本地公司 - 全球

于 2012-07-25T14:43:25.053 回答
0

maven 使用正常的 http 调用与存储库进行交互。您不需要任何东西,只需要一个 http 服务器来为 maven 存储库提供服务。maven 依赖于特定的目录层次结构和一些元数据文件。(maven 缓存已下载文件的本地磁盘存储库是完全相同的格式)。

于 2012-07-25T13:49:09.357 回答