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

Rod*_*iro 3 structure pom.xml maven

我的项目的结构如下:

.
 |--module
 |  `-- pom.xml
 |  --submodule
 |    `-- pom.xml
 `-- pom.xml
Run Code Online (Sandbox Code Playgroud)

POM(简体):

  • 项目:
.
 |--module
 |  `-- pom.xml
 |  --submodule
 |    `-- pom.xml
 `-- pom.xml
Run Code Online (Sandbox Code Playgroud)
  • 模块:
<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>
Run Code Online (Sandbox Code Playgroud)
  • 子模块:
<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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

khm*_*ise 5

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

<relativePath>../pom.xml</relativePath>
Run Code Online (Sandbox Code Playgroud)

这是没有用的,因为它是maven中的默认值,或者将其删除。

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

模块:pom.xml

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

    <name>Module</name>

    <modules>
        <module>submodule</module>      
    </modules>
    (...)
</project>
Run Code Online (Sandbox Code Playgroud)

除此之外,您无法进入子模块并调用

mvn install
Run Code Online (Sandbox Code Playgroud)

如果要安装多模块构建中的单独模块,则应使用以下内容:

mvn -amd -pl submodule install
Run Code Online (Sandbox Code Playgroud)

它将完成您想做的事情,但是通常您应该安装完整的多模块构建,除非您完全知道自己在做什么。-amd选项是--also-make-dependents的缩写。该-pl是一个缩写--projects确定应当在通话过程中进行项目的列表。