2017-04-05 64 views
3

我遇到了一个奇怪的Maven配置问题,这是我以前从未遇到过的,并且对我的解决方案感到困惑。为什么我需要在我的settings.xml文件中指定一个存储库

我有一个本地的Nexus服务器,我用它来作为一切的镜像。到现在为止,我只有以下镜子在我的settings.xml文件:

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

然而,最近我想创造我已经部署到我的Nexus回购自己的定制父POM。在我的项目,我已经指出了我的父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> 

自从我镜像所有回购/网址,我可以在URL设置为任意值,现在Maven会拿起我的父母。

那么,为什么我甚至需要指定存储库呢? Maven是否应该自动尝试解决maven central或其他默认存储库中的父pom?

+0

请显示您的pom文件...它不会解决Maven Central因为您已配置为mirrorOf所有条目到您的内部存储库管理器是正确的。 – khmarbaise

+0

@khmarbaise我意识到它不会真正到达maven中心,但我期待它尝试,然后由于镜像设置而重定向到我的连接点。 pom文件非常基本 - 除了父定义之外,它还有一些属性,依赖关系定义和几个插件定义。没有存储库或分发管理条目。 –

+0

@khmarbaise一旦我坐下来思考这一点,我得出的结论是,如果我没有明确指定SNAPSHOT存储库,maven不知道该去哪里查找SNAPSHOT构件。这是设计吗?是否没有默认回购(如maven中心)的快照文物? –

回答

1

这不是一个奇怪的配置问题,而仅仅是从你身边的一个误解。您所做的是在您的父POM中填入<distributionManagement/>,并在您的本地Nexus实例中添加一个包含所有镜像的settings.xml,并期望它可以正常工作。

你真的知道你在镜像吗?没有! Maven的默认硬编码回购是Maven Central。这是一个不包含任何快照的发行版回购。因此你会看到ERROR。虚假回购是必要的,以使Maven能够从您的Nexus实例请求快照,否则它只会请求发布。 Nexus还有一个包含Central的回购组和您的托管版本和快照回购。

只要您没有在您的POM中定义任何快照回购(您不应该这样做),Maven将永远无法下载任何快照。

+0

这是我的预期。我不确定是否有定义快照的默认存储库。 –

相关问题