Maven抱怨父相对路径
Posted
技术标签:
【中文标题】Maven抱怨父相对路径【英文标题】:Maven complaining about parent relative path 【发布时间】:2016-08-31 22:38:32 【问题描述】:考虑一个带有模块的 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,以便可以继承属性。达到了这个目的。
当前的问题是,当模块 utils 还需要引用 ref-pom 作为其父 pom(并且 ref-pom 将引用 project-parent 作为其父 pom)时,maven 抱怨 'parent.relativePath' 指向到 project-parent 而不是 ref-pom,建议再次验证项目结构。
由于这只是一个警告,我仍然可以编译项目,但我想知道设置项目结构的正确方法,以便 maven 满意并达到我的目的。
【问题讨论】:
你能显示你的项目结构(文件夹结构)和你的pom文件的位置吗? 总结所有可能的问题:***.com/a/62704660/6172857 【参考方案1】:为了解析父项目,检查了这些可能的来源:
相对路径 本地存储库 远程存储库相对路径,如果没有明确给出,默认为..
,即当前项目的父目录下的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
模块确实是必要的,或者这些 pom 的内容是否可以并且应该更好地放置在各自的 *-util
模块中.
【讨论】:
非常有用的信息,谢谢!是的,我认为我可能真的应该将 utils 模块下移一层到 ref-pom 模块中。 澄清一下,如果 Maven 在公共存储库中找到父 POM,它会做什么?或者即使父 POM 在远程存储库(如 Maven Central)中可用,它是否仍然提供警告,在这种情况下,即使像 ***.com/a/6006098/421049 似乎暗示的那样,我也必须为已发布的父 POM 放置一个空的相对路径? 如果 relativePath 指向的 pom(显式或隐含默认值)与当前 pom 的父语句中的 on 坐标不同,则会发出警告。 发出警告后,将在本地和远程存储库中进行查找。我不建议使用空的 relativePath,因为在这种情况下它只会隐藏警告,而不会解决根本问题。 'abuse' 空白 project.parent.relativePath 值只是必要的,因为 Maven 除了扩展插件之外没有其他设置导入支持;具有讽刺意味的是,非父目录父级通常用于 Maven 插件。看起来 Maven 开发人员已经意识到默认情况下应该扁平化已安装的 pom 以删除然后毫无意义的父声明。以上是关于Maven抱怨父相对路径的主要内容,如果未能解决你的问题,请参考以下文章
使用相对路径将一个 Maven 项目包含到另一个 Maven 项目中
如何在 Maven 和 Intellij 之间处理 Junits 中的相对路径