Maven如何知道要使用哪个仓库来获取依赖项?

8

首先,我在谷歌上搜索了一下,但好像找不到答案。如果这是一个显而易见的答案,请原谅。

在Maven中,我们可以定义0个或多个资源库来查找资源。资源库可以在settings.xml或您的pom中定义。默认情况下,如果您未定义任何资源库,所有内容都将来自一个名为“central”的资源库,这只是由Maven维护的默认资源库。

下面是来自jboss eap示例应用程序的设置pom片段。当我执行mvn clean install时,我可以看到一些东西从中央库中获取,另一些则从jboss存储库中获取。依赖标签中似乎没有任何告诉Maven哪个存储库包含该依赖项的信息,那么它如何决定?是否与依赖项中的组ID相关联,还是Maven只是逐个检查所有存储库,直到找到包含JAR文件的第一个存储库为止?

<dependencies>
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jboss.spec.javax.xml.bind</groupId>
        <artifactId>jboss-jaxb-api_2.3_spec</artifactId>
    </dependency>
</dependencies>


   <repositories>
        <repository>
            <id>jboss-enterprise-maven-repository</id>
            <url>https://maven.repository.redhat.com/qa/</url>
        </repository>
        <repository>
            <id>jboss-enterprise-maven-repository-ea</id>
            <url>https://maven.repository.redhat.com/earlyaccess/all/</url>
        </repository>
        <repository>
            <id>jboss-public-repository-group</id>
            <name>JBoss Public Maven Repository Group</name>
            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
        </repository>
    </repositories>

1
通过解决可用存储库列表中的最新版本。对于企业开发,甚至是合理的版本控制,您需要对依赖项进行版本控制(并仅使用受控的内部存储库,以便您可以控制第三方许可证的许可和批准)。 - Elliott Frisch
1
据我所知,您需要指定一个版本。如果您不指定版本,Maven 将抛出验证错误。由于父 POM 中的依赖管理标签部分指定了版本,因此上面省略了它。由于它与我的问题无关,我希望保持帖子简单。 - George
2个回答

5
让我们看一下官方文档

按照以下顺序查询远程存储库URL以获取存储的工件,直到返回有效结果为止:

  1. 生效设置:
  • 全局settings.xml
  • 用户settings.xml
  1. 本地生效构建POM:
  • 本地pom.xml
  • 父POM,递归处理
  • 超级POM
  1. 从依赖路径到工件的生效POM。

对于这些位置,首先按照构建配置文件介绍中概述的顺序查询profiles中的存储库。

在从存储库下载之前,会应用镜像配置。

可以使用mvn help:effective-settingsmvn help:effective-pom -Dverbose轻松查看考虑了profile的生效设置和本地构建POM的存储库顺序。


4

Maven只是遍历整个库列表,查找所有存储库。

无法将依赖项绑定到特定存储库。


1
你有这个信息的来源吗?还是这只是常识?从我看到的情况来看,似乎已经被证实了。我认为即使应该在Maven中央库中的库也来自jboss仓库。可能是jboss仓库中缺少一些东西,因为我仍然看到一些对Maven中央库的调用。 - George
我会继续并将其标记为接受的答案 - 谢谢!但如果您恰好有来源,那也很好。 - George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接