Maven:POM模块和子模块层次结构

时间:2013-02-19 13:27:24

标签: maven structure pom.xml

我的项目结构如下:

.
 |--module
 |  `-- pom.xml
 |  --submodule
 |    `-- pom.xml
 `-- pom.xml

POM(简化):

  • 项目:
<project>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>project</artifactId>
    <name>Project</name>
    <groupId>org.myorg</groupId>
    <version>1.0.6-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>module</module>     
    </modules>
    (...)
</project>
  • 模块:
<project>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.myorg</groupId>
        <artifactId>project</artifactId>
        <version>1.0.6-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>module</artifactId>
    <name>Module</name>
    <groupId>org.myorg</groupId>
    <version>1.0.6-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>submodule</module>      
    </modules>
    (...)
</project>
  • 子模块:
<project>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.myorg</groupId>
        <artifactId>module</artifactId>
        <version>1.0.6-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>submodule</artifactId>
    <name>Submodule</name>
    <groupId>org.myorg</groupId>
    <version>1.0.6-SNAPSHOT</version>
    <packaging>jar</packaging>
    (...)
</project>

在POM的项目模块中运行maven install时,项目已成功构建。但是,当在子模块中运行时会出现此错误:

无法在项目子模块上执行目标:找不到工件org.myorg:project:pom:1.0.6-SNAPSHOT

为什么我的子模块找不到POM 项目?指定了相对路径。

2 个答案:

答案 0 :(得分:4)

我注意到的第一件事是每个拥有父项的子模块都包含以下行:

<relativePath>../pom.xml</relativePath>

这是无用的,因为它在maven中是默认的,或者换句话说就是删除它。

此外,在多模块构建中,您不应定义版本。如果groupId始终相同,您也可以省略groupId,导致当前模块从其父级继承该版本。

module:pom.xml

<project>
    <parent>...
    </parent>    
    <artifactId>module</artifactId>
    <packaging>pom</packaging>

    <name>Module</name>

    <modules>
        <module>submodule</module>      
    </modules>
    (...)
</project>

除此之外,您无法进入子模块并致电

mvn install

如果您想安装多模块构建的单独模块,您应该使用以下内容:

mvn -amd -pl submodule install

这将做你喜欢做的事情,但通常你应该安装一个完整的mulit-module构建,除非你完全知道你在做什么。 选项 -amd - also-make-dependents 的缩写。 -pl - projects 的缩写,用于定义在调用期间应该进行的项目列表。

答案 1 :(得分:1)

首先,您需要在根项目上运行mvn install,它将在您的本地maven仓库中创建工件。从病房第二次开始,您只能运行子模块。如果你不在root项目上运行maven就不会为你的项目创建任何工件,所以当你运行子模块时它无法从maven repo中找到工件。