【问题标题】:Why do I need to specify a repository in my settings.xml file为什么我需要在我的 settings.xml 文件中指定一个存储库
【发布时间】:2017-04-12 03:06:49
【问题描述】:

我遇到了一个以前从未遇到过的奇怪的 Maven 配置问题,并且对我的解决方案感到困惑。

我有一个本地 Nexus 服务器,用作所有内容的镜像。到目前为止,我的 settings.xml 文件中只有以下镜像:

    <mirrors>
            <mirror>
                    <id>nexus</id>
                    <mirrorOf>*</mirrorOf>
                    <name>WADA Nexus</name>
                    <url>https://nexus.domain.org/repository/Public/</url>                                                                                               
            </mirror>
    </mirrors>

但是,我最近想创建自己的自定义父 pom,并将其部署到我的 Nexus 存储库中。在我的项目中,我已经指向了我的父 pom:

   <parent>
            <groupId>org.domain</groupId>
            <artifactId>root-pom</artifactId>
            <version>1.0.0-SNAPSHOT</version>
    </parent>

但是,当我现在尝试运行我的构建时,它会失败并显示以下内容:

ERROR: Failed to parse POMs
org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM: Could not find artifact org.domain:root-pom:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 9, column 10

出于某种原因,maven 没有尝试在我的 Nexus 存储库中查找父 pom。

我唯一的解决方法是在我的 settings.xml 文件中定义一个随机存储库值:

 <repositories>
    <repository>
      <id>nexus</id>
      <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
        <checksumPolicy>warn</checksumPolicy>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>never</updatePolicy>
        <checksumPolicy>fail</checksumPolicy>
      </snapshots>
      <url>https://www.google.com/anythingCanGoHere</url>
      <layout>default</layout>
    </repository>
  </repositories>

由于我已经镜像了所有的 Repos/URL,我可以将该 url 设置为任何值,maven 现在将获取我的父 pom。

那么,为什么我什至需要指定存储库? maven 不应该自动尝试针对 maven central 或其他一些默认存储库解析父 pom 吗?

【问题讨论】:

  • 请出示您的 pom 文件...它不会针对 Maven Central 解决,因为您已配置为将所有条目镜像到您的内部存储库管理器,这是正确的。
  • @khmarbaise 我意识到它实际上不会到达 maven Central,但我希望它会尝试然后由于镜像设置而被重定向到我的关系。 pom 文件非常基础——除了父定义之外,它还有一些属性、依赖定义和几个插件定义。没有存储库或分发管理条目。
  • @khmarbaise 一旦我坐下来仔细考虑这个问题,我得出的结论是,如果我没有明确指定 SNAPSHOT 存储库,maven 不知道去哪里寻找 SNAPSHOT 工件。这是设计使然吗?快照工件是否没有默认存储库(如 maven Central)?

标签: java maven


【解决方案1】:

这不是一个奇怪的配置问题,而只是您的误解。您所做的是在您的父 POM 中填充 &lt;distributionManagement/&gt; 并在您的 settings.xml 中添加一个包含本地 Nexus 实例的包罗万象的镜像,并期望它能够正常工作。

你真的知道你在镜像什么吗?不! Maven 中默认的硬编码存储库是 Maven Central。这是一个不包含任何快照的发布仓库。因此,您会看到ERROR。伪造的 repo 是使 Maven 能够从您的 Nexus 实例请求快照所必需的,否则它只会请求发布。 Nexus 又拥有一个包含 Central 的存储库组以及您托管的版本和快照存储库。

只要您不在 POM 中定义任何快照存储库(您不应该这样做),Maven 就永远无法下载任何快照。

【讨论】:

  • 这有点出乎我的意料。我不确定是否定义了快照的默认存储库。
猜你喜欢
  • 2016-10-25
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2021-01-22
  • 2012-05-23
  • 2020-07-07
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多