【问题标题】:How does Maven interact with different repositories?Maven 如何与不同的存储库交互?
【发布时间】:2012-07-25 13:40:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: java maven nexus artifactory


    【解决方案1】:

    Yoy 定义存储库以两种方式搜索工件:

    1) 在项目部分的 pom.xml 中

    <project>
        ....
        <repositories>
             <repository>
                ...
                <url>...</url>
             </repository>
        </repositories>
    </project>
    

    2) 和/或在文件$USER_HOME$/.m2/settings.xml 中(网上有很多例子)

    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 级存储库:本地 - 本地公司 - 全球

    【讨论】:

    • 谢谢,这很有帮助!您对此“RepoUrl/groupId/version/artifactId-version-classifier.type”约定有某种正式的参考吗?
    • @Ido.Co [link] docs.codehaus.org/display/MAVEN/Repository+Layout+-+Final) 似乎是你想要的。这是谷歌的第二次引用“maven 存储库布局”。 (他是我们的朋友 :)
    • 再次感谢。当您知道谷歌的术语时,它总是很容易:)
    • 我已将工件 http 路径更新为正确的 - RepoUrl/groupId/artifactId/version/artifactId-version-classifier.type
    【解决方案2】:

    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 存储库。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-05-29
        • 1970-01-01
        • 2020-02-02
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        相关资源
        最近更新 更多