1

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

| 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.xmlofmodule1包含以下parent部分:

<parent>
    <groupId>my-group</groupId>
    <artifactId>parent-pom</artifactId>
    <version>1.0.0</version>
</parent>

我从一个干净的本地存储库开始;没有一个工件是预先构建的,一切都是从头开始的。尝试执行mvn installonparent-pom会导致错误,因为 Maven reactor 会my-group:base-pom在本地仓库中查找,失败(因为它不存在)然后查找../pom.xml.

美好的。我的问题是:如果构建module1是通过构建调用的parent-pom,为什么 Maven 甚至必须在pom.xml 任何地方寻找父级?当 Maven 来 build 时module1,它已经知道以下事情:

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

为什么要看别处?

4

1 回答 1

0

POM简介:项目继承:示例2告诉我们如下:-

情景

但是,如果父项目已经安装在我们的本地存储库中或者在那个特定的目录结构中(父项目pom.xml比模块的目录高一个目录pom.xml),这将起作用。

但是如果还没有安装父目录并且目录结构是

.
 |-- 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到父级的pom.xml.

编辑:

getRelativePath告诉我们如下

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

我希望这可能会有所帮助。

于 2013-03-26T08:31:04.167 回答