4

我的项目结构如下:

.
 |--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>

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

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

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

4

2 回答 2

6

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

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

这是没用的,因为它在 Maven 中是默认的,或者换句话说只是删除它。

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

模块: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

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

于 2013-02-19T13:57:19.093 回答
4

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

于 2014-02-18T06:44:17.837 回答