在多模块构建中,为什么需要告知子模块在哪里可以找到父POM?

时间:2013-03-26 07:43:31

标签: maven pom.xml parent-pom

考虑平面多模块布局的以下场景:

| 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时,它已经知道以下事情:

  1. 文件系统的物理位置pom.xml
  2. module1根植于my-group:parent-pom:1.0.0
  3. 的事实

    为什么要去其他地方?

1 个答案:

答案 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}}。

EDITED:

getRelativePath告诉我们如下

  

在签出中获取父pom.xml文件的相对路径。 默认值为../pom.xml 。 Maven首先在当前构建项目的反应堆中查找父pom,然后在文件系统上的这个位置,然后是本地存储库,最后在远程仓库中查找。 relativePath允许您选择不同的位置,例如,当您的结构是平的时,或更深,没有中间父pom 。但是,组ID,工件ID和版本仍然是必需的,并且必须与给定位置中的文件匹配,否则它将恢复为POM的存储库。此功能仅用于增强该项目本地结账的开发。

我希望这可能有所帮助。