考虑一个带有模块的maven项目,其中包含一些实用程序(jar)和一些poms,供其他人参考,如果他们想要使用其中一些实用程序。
e.g。在父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,以便可以继承属性。达到了这个目的。
当前问题是当模块utils还需要引用ref-pom作为其父pom(并且ref-pom将ref.project-parent作为其父pom)时,maven抱怨'parent.relativePath'指向to project-parent而不是ref-pom,建议再次验证项目结构。
由于这只是一个警告,我仍然可以编译项目,但我想知道设置项目结构的正确方法,以便maven很高兴并且我的目的得到满足。
答案 0 :(得分:27)
为了解析父项目,我们会检查这些可能的来源:
相对路径,如果没有明确给出,则默认为..
,即当前项目的父目录中的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-pom
和server-ref-pom
)
<强>然而强>
你应该考虑这是否真的是你想要的,在你的情况下,如果真的需要单独的*-ref-pom
模块,或者这些poms的内容能够而且应该更好地放在相应的{{{ 1}}模块。