Maven抱怨父级相对路径问题

31
考虑一个Maven项目,其中包含多个模块,包括一些工具(jar文件),以及一些pom文件,供其他人引用,如果他们想要使用这些工具。例如,在父pom.xml文件中。
<artifactId>project-parent</artifactId>
<modules>
  <module>client-ref-pom</module> (a module with just one pom.xml)
  <module>server-ref-pom</module> (a module with just one pom.xml)
  <module>client-utils</module> (a module with some utility classes, needs to ref. client-ref-pom)
  <module>server-utils</module> (a module with some utility classes, needs to ref. server-ref-pom)
  <module>utils</module> (a module with some utility classes, needs to ref. project-parent)
</modules>

因此,如果有另一个项目希望使用这些工具,它将把ref-pom作为其父级pom进行引用,以便属性可以被继承。这个目的已经达到。

当前问题是,当模块utils也需要将ref-pom作为其父级pom进行引用时(而ref-pom将引用project-parent作为其父级pom),Maven会抱怨'parent.relativePath'指向project-parent而不是ref-pom,并建议再次验证项目结构。

由于这只是一个警告,我仍然可以编译项目,但我想知道设置项目结构的正确方法,以使Maven满意并且达到我的目的。


1
你能展示一下你的项目结构(文件夹结构)以及pom文件所在位置吗? - khmarbaise
所有可能的问题总结如下:https://dev59.com/e2Ij5IYBdhLWcg3wHhz_#62704660 - Sumit Badsara
2个回答

58

为了解决父级项目,将检查以下可能的来源:

  • 相对路径
  • 本地仓库
  • 远程仓库

如果没有显式给出相对路径,默认为..,即当前项目的父目录中的pom文件。因此,Maven会检查该目录中是否存在pom文件,并且该pom文件包含与当前项目的父定义中所述的坐标相同的内容。

如果a)和b)为真,则使用该pom文件作为解析有效pom的父级。

如果a)为真,而b)为假,则会发出警告,因为这通常指向配置不正确的项目(例如您的情况),并且将忽略pom。

如果a)为假,则会检查其他来源。

因此,在您的情况下,我假设您在utils/pom.xml中有以下内容:

<parent>
  <groupId>...</groupId>
  <artifactId>ref-pom</artifactId>
  <version>..</version>
</parent>

这隐含了<relativePath>..</relativePath>。因此Maven会检查utils的父目录,找到一个POM,但此时它被命名为project-parent而不是期望的ref-pom,因此出现了警告。

以下方式可以解决问题:

<parent>
  <groupId>...</groupId>
  <artifactId>ref-pom</artifactId>
  <version>..</version>
  <relativePath>../ref-pom</relativePath>
</parent>
(Note that in your text, you write about ref-pom, but in the modules above there is only client-ref-pom and server-ref-pom) 但是 您应该思考一下这是否确实是您想要的,在您的情况下,如果单独的*-ref-pom模块真的有必要或者这些pom的内容能否更好地放置在相应的*-util模块中。

非常有用的信息,谢谢!是的,我觉得也许我应该把utils模块下移一级到ref-pom模块中。 - user1589188
只是为了澄清一下,如果Maven在公共仓库中找到了父POM,它会做什么?或者即使父POM在远程仓库(如Maven Central)中可用,它是否仍然会提供警告,就像https://dev59.com/22025IYBdhLWcg3wcli-#6006098所示的那样,在这种情况下,我必须放置一个空的相对路径,即使是已发布的父POM。 - Garret Wilson
如果相对路径(显式或隐式默认)所指向的pom与当前pom的父语句中的pom坐标不同,则会发出警告。发出警告之后,会执行本地和远程仓库的查找。我不建议使用空的相对路径,因为在这种情况下,它只会隐藏警告,而没有解决潜在的问题。 - blackbuild
“abuse”一个空项目.parent.relativePath值的原因是Maven除了扩展插件外没有其他支持设置导入的方式;具有讽刺意味的是,非父目录父目录通常用于Maven插件。此外,看起来Maven开发人员已经意识到默认情况下应该将安装的pom文件展平,以删除无意义的父声明。 - Infernoz

0
在我的情况下,我试图创建一个简单的“Spring Starter Project”,但我不知道为什么总是抛出相同的错误“Non resolvable parent pom...”。
所以我注意到在这个路径下:“C:\Users\你的用户名\.m2”我有一个名为configuration.xml的文件,这个文件与项目的创建发生了冲突。
甚至我注意到在.m2文件夹里有很多旧版本的存储库。
解决办法是删除.m2文件夹。当我创建我的新的“Spring Starter Project”时,它会自动在相同的路径下创建一个带有更新版本的存储库的新.m2文件夹。
希望这对任何人有所帮助 :)

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