maven无法从子目录构建子模块

时间:2015-09-13 11:46:47

标签: java maven

我有一个带有父pom和子模块的maven项目,结构如下:

root/pom.xml
root/parent/pom.xml
root/child1/pom.xml
root/child2/pom.xml
root/child2/child21/pom.xml

每个子pom和根pom声明root / parent为其父级。 child21将child1作为依赖项。

当我尝试从child1目录执行mvn install时,maven成功构建并安装了child1 jar。但是当我从child2或child21目录执行mvn install时,maven会出现以下错误:

  

[错误]无法在项目child21上执行目标:无法解析项目groupId的依赖项:child21:jar:0.0.1-SNAPSHOT:无法在groupId收集依赖项:child1:jar:0.0.1-SNAPSHOT:失败读取groupId的工件描述符:child1:jar:0.0.1-SNAPSHOT:找不到工件groupId:parent:pom:0.0.1-SNAPSHOT in jme-repo(http://updates.jmonkeyengine.org/maven/) - > [帮助1]

我尝试使用谷歌搜索我的项目结构可能出错但没有运气。任何人都可以帮助建议让孩子21建立的方法吗?

我的poms包含:

<parent>
    <groupId>groupId</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>./parent/pom.xml</relativePath>
</parent>
<artifactId>root</artifactId>
<packaging>pom</packaging>

<modules>
    <module>child1</module>
    <module>child2</module>
</modules>

<groupId>groupId</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>groupId</groupId>
            <artifactId>child1</artifactId>
            <version>${project.version}</version>
        </dependency>
        ...
    </dependencies>
<dependencyManagement>

<repositories>
    <repository>
        <id>jme-repo</id>
        <name>JME3 Official Maven Repo</name>
        <url>http://updates.jmonkeyengine.org/maven/</url>
    </repository>
</repositories>

<build>
    <plugins>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
            <source>${java.source.version}</source>
            <target>${java.target.version}</target>
        </configuration>
    </plugins>
</build>

儿童1

<parent>
    <groupId>groupId</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../parent/pom.xml</relativePath>
</parent>

<artifactId>child1</artifactId>
<packaging>jar</packaging>

<dependencies>...</dependencies>

儿童2

<parent>
    <groupId>groupId</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>child2</artifactId>
<packaging>pom</packaging>

<modules>
    <module>child21</module>
</modules>

21岁儿童

<parent>
    <groupId>groupId</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../../parent/pom.xml</relativePath>
</parent>
<artifactId>child21</artifactId>
<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>groupId</groupId>
        <artifactId>child1</artifactId>
    </dependency>
</dependencies>

更新解决方案 根据下面接受的答案,我将父项目添加为根pom的模块:

<parent>
    <groupId>groupId</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>./parent/pom.xml</relativePath>
</parent>
<artifactId>root</artifactId>
<packaging>pom</packaging>

<modules>
    <module>parent</module>
    <module>child1</module>
    <module>child2</module>
</modules>

然后,当开发人员第一次构建项目时,将安装父pom。随后他们将能够独立构建child2和child21项目。

2 个答案:

答案 0 :(得分:3)

这是一个非常笨拙的模块结构,但它仍然可以工作。问题是,当您构建模块child21(或child2)时,child1依赖项不是当前构建的一部分,而是在存储库中查找。那个依赖项的父代也是parent模块。但是,我认为,parent从未安装在那里 - 如果您在mvn clean install上运行root,则不会构建parentchild仅在{{1}中引用相对路径的模块。

要修复它,必须先将parent POM安装到存储库中。在父模块中运行mvn install。之后,构建child1 - 它也将安装到存储库中。现在,存储库中提供了构建模块child21所需的一切。

答案 1 :(得分:0)

将child21更改为从其父 - child2继承,见下文:

<parent>
   <groupId>groupId</groupId>
   <artifactId>child2</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</parent>