29

考虑一个带有模块的 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>

因此,如果有另一个项目希望使用 utils,它将引用 ref-pom 作为其父 pom,以便可以继承属性。达到了这个目的。

当parent 而不是 ref-pom,建议再次验证项目结构。

由于这只是一个警告,我仍然可以编译该项目,但我想知道设置项目结构的正确方法,以便 maven 很高兴并达到我的目的。

4

1 回答 1

54

为了解析父项目,检查这些可能的来源:

  • 相对路径
  • 本地存储库
  • 远程存储库

相对路径,如果没有明确给出,默认为..,即当前项目的父目录下的 pom。因此 Maven 会检查 a) 该目录中是否存在 pom 文件和 b) 该 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>

(请注意,在您的文本中,您写的是 ref-pom,但在上面的模块中只有client-ref-pomand server-ref-pom

然而

您应该考虑这是否真的是您想要的,在您的情况下,是否*-ref-pom真的需要单独的模块,或者这些 pom 的内容是否可以并且应该更好地放置在相应的*-util模块中。

于 2016-05-06T09:29:22.753 回答