Maven如何与不同的存储库进行交互?

时间:2012-07-25 13:40:32

标签: java maven nexus artifactory

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

是否使用REST API完成?可以将依赖的工件解析为实际位置以使它们不能使用这些API,但这两个API在某种程度上彼此不同(据我所见[Artifactory] [Nexus])和存储库定义元素在Maven pom文件中不包含声明存储库类型的属性。

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

3 个答案:

答案 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

找到poms和jar

这意味着遵循此约定的每个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缓存文件的格式完全相同)。