考虑平面多模块布局的以下场景:
| parent-pom
| - pom.xml
| module1
| - pom.xml
其中parent-pom/pom.xml
是所有模块的父POM:
<groupId>my-group</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.0</version>
...
...
<module>../module1</module>
现在,pom.xml
的{{1}}包含以下module1
部分:
parent
我从一个干净的本地存储库开始;没有任何工件是预先构建的,一切都是从头开始完成的。尝试在<parent>
<groupId>my-group</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.0</version>
</parent>
上执行mvn install
将导致错误,因为Maven反应器将在本地存储库中查找parent-pom
,失败(因为它不存在)然后查找{{ 1}}。
精细。我的问题是:如果通过构建my-group:base-pom
来调用../pom.xml
的构建,为什么Maven甚至必须在任何地方查找父级module1
??当Maven来构建parent-pom
时,它已经知道以下事情:
pom.xml
。module1
根植于my-group:parent-pom:1.0.0
。为什么要去其他地方?
答案 0 :(得分:0)
Introduction to the POM:Project Inheritance:Example 2告诉我们如下: -
但是,如果父项目已经安装在我们的本地存储库中或者在特定目录结构中(父pom.xml
是一个高于模块pom.xml
的目录),那将会有效。 / p>
但是如果尚未安装父级并且目录结构是
,该怎么办?.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
要解决此目录结构(或任何其他目录结构),我们必须将<relativePath>
元素添加到父节。
<project>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>my-module</artifactId>
</project>
顾名思义,它是模块的relative path
到父级pom.xml
的{{1}}。
getRelativePath告诉我们如下
在签出中获取父pom.xml文件的相对路径。 默认值为../pom.xml 。 Maven首先在当前构建项目的反应堆中查找父pom,然后在文件系统上的这个位置,然后是本地存储库,最后在远程仓库中查找。 relativePath允许您选择不同的位置,例如,当您的结构是平的时,或更深,没有中间父pom 。但是,组ID,工件ID和版本仍然是必需的,并且必须与给定位置中的文件匹配,否则它将恢复为POM的存储库。此功能仅用于增强该项目本地结账的开发。
我希望这可能有所帮助。