Maven 3.0.3使用相对路径符号时,无法解析父POM。

31

迁移到 Maven 3.0.3 后,几个项目中的父 POM 无法再被解析。

这些项目按照默认方式进行结构化,因此我将 parent.relativePath 设置为 "../pom.xml"。

superpom (located in repository)
|-rootpom (located locally: no error)
|-|-parentpom (located locally: error resolving parent)
|-|-|-module1 (located locally: error resolving parent)
|-|-|-module2 (located locally: error resolving parent)
|-|-|-module3 (located locally: error resolving parent)
|-|-|-module4 (located locally: error resolving parent)

错误信息...

myGroup:myArtifactId:1.0的父POM无法解析,因为在本地存储库中缓存了无法找到myGroup:myParentArtifactId:1.0的错误http://myRepo.net/archiva/repository/maven2,直到maven2的更新间隔已过或强制更新并且'parent.relativePath'指向错误的本地POM @ myGroup:myParentArtifactId:1.0,C:\myProjectDir\parent\pom.xml,x行y列 -> [帮助 2]

...似乎表明在存储库中搜索pom文件,因此我想知道为什么在查找其他位置之前没有在本地找到pom文件。

我读过当在settings.xml中定义多个存储库时,maven3可能会感到困惑,但这通常发生在搜索存储库中的pom文件时,而不是在本地。

更新

到目前为止,我们在父项目级别(parentpom)上执行了maven构建-这是一个我不知道很重要的事实,因为直到现在maven2都成功完成了。

使用maven3时,这似乎很重要。在根项目级别(rootpom)上执行maven3时,构建成功结束。因此,我的问题得到了解决。

由于我不一定想回答自己的问题,也许有人可以解释为什么maven3现在会这样或者为什么旧方法是错误的。


你尝试过仅设置 relativePath 为文件夹名称吗?(例如,../,不需要 pom.xml - palacsint
我已经尝试过“..”、“../pom.xml”和现在的“../”。 - elfwyn
8个回答

34

请务必仔细检查子POM中所引用的版本是否与父POM中的版本相同。对我来说,我在父POM中将版本升级到了3.1.0.0-RELEASE,但在子POM中,我仍然通过relativePath引用了先前的版本,并将其定义为2.0.0.0-SNAPSHOT。无论是只包括父目录还是在目录后面添加“pom.xml”,都没有任何区别:

    <parent>        
    <artifactId>eric-project-parent</artifactId>
    <groupId>com.eric.common</groupId>
     <!-- Should be 3.1.0.0-RELEASE -->
    <version>2.0.0.0-SNAPSHOT</version>     
    <relativePath>
                ../../EricParentAsset/projects/eric-project-parent</relativePath>           
</parent>

11

这里是你问题的答案

默认情况下,Maven在../pom.xml中查找relativePath。请使用空的<relativePath/>标签代替。


1
使用相对路径 <relativePath>./pom.xml<relativePath> 也可以工作,而且对于查看此 POM 的下一个人来说会更清晰。 - Sled
3
ArtB,你提议将当前项目的pom设置为父pom。对我来说,这比空字符串更令人困惑。我认为这不会起作用。以下是文档中的说明: 如果要禁用该功能并始终从存储库解析父POM,请将值设置为空字符串。 - Ilya Silvestrov

6

'parent.relativePath'指向了错误的本地POM @ myGroup:myParentArtifactId:1.0,C:\myProjectDir\parent\pom.xml

这表明Maven在本地搜索父POM时发现它不是正确的POM。

  • parentpompom.xml是否正确将其parent POM定义为rootpompom.xml
  • rootpom文件夹中是否包含pom.xml以及paretpom文件夹?

1
是的,我的父项目的父项目已经正确定义为根项目(版本、artifact-id、group-id和相对路径),而且根项目文件夹中包含父项目文件夹。这些项目使用maven2编译没有问题。在切换到maven3后,我只是添加了相对路径。 - elfwyn

2

我有同样的问题。我的项目布局看起来像这样

\---super
    \---thirdparty
        +---mod1-root
        |   +---mod1-linux32
        |   \---mod1-win32
        \---mod2-root
            +---mod2-linux32
            \---mod2-win32

在我的情况下,我在modX-root级别的pom.xml中犯了一个错误。我复制了mod1-root树并将其命名为mod2-root。我错误地认为我已经适当地更新了所有的pom.xml;但事实上,mod2-root/pom.xml与mod1-root/pom.xml具有相同的组和工件ID。在将mod2-root的pom.xml更正为具有mod2-root特定的maven坐标后,我的问题得到了解决。


1

您需要检查相对路径,基于模块与其父级之间的深度。如果模块刚好在父级下方,则在模块中放置相对路径: ../pom.xml

如果它在第二层目录下,则为 ../../pom.xml


0

对我来说,当我仔细检查父级的“group ID”和“artifact ID”时,它就能正常工作了。在我的情况下,这些信息是错误的,这就是问题所在。


0
请检查日志是否出现了"basicAuthScope"无法找到的错误或警告,如果是这样,您需要使用maven 3.2.5版本来解决此问题。

0
<parent>
        <groupId>com.test.vaquar.khan</groupId>
        <artifactId>vk-parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../projectname/pom.xml</relativePath>
    </parent>

在父级中添加以下行:
<relativePath>../projectname/pom.xml</relativePath>

如果您正在从本地父POM构建项目,而该POM在Nexus中不可用,则需要使用相对路径。将POM添加到Nexus中后,就不需要这个路径了。

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