我正在使用继承的pom启动Maven项目。
该项目的父pom是这样的:
<artifactId>service-parent</artifactId>
<groupId>group.parent</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>child-of-parent</module> ...
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
...
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
...
</dependencies>
</dependencyManagement>
因此,在子模块中,如果我理解得很好,部分依赖项将自动继承,而部分依赖项必须在child的pom中声明。我将其写在孩子的pom中:
<parent>
<artifactId>service-parent</artifactId>
<groupId>group.parent</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>service-child</artifactId>
<groupId>group.child</groupId>
<packaging>pom</packaging>
<modules>
<module>child-of-child</module>
</modules>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
此子模块具有自己的子模块。因此,第三级pom受到打击:
<parent>
<artifactId>service-child</artifactId>
<groupId>group.child</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>service-child-child</artifactId>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>service-child</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
有点像这样的连线,因为在pom的开头,它已经具有与依赖项相同的标记。这是因为如果我在其父级中复制依赖项,则会出现重复警告。
当我运行maven clean install
时,它说
无法对项目service-child执行目标:无法解决项目service-parent:service-child:jar:1.0-SNAPSHOT的依赖项: 以下工件无法解决: group.child:service-child:jar:1.0-SNAPSHOT, group.parent:service-parent:jar:1.0-SNAPSHOT:找不到工件 group.child:service-child:jar:1.0-SNAPSHOT
我知道这是一种聚合方式,而不是继承方式,但是我以后更喜欢这种方式,我想逐个模块测试和运行模块(我尝试通过删除父poms中的modules声明来尝试继承方式,并且确实起作用了)。你知道为什么会这样吗?
答案 0 :(得分:0)
这是因为service-child
的类型(包装)是pom
而不是jar
。
不可能有一个带有jar
封装且带有子模块的项目。
如果仍然需要声明该依赖关系,请使用以下声明-注意type
元素,其值为pom
:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>service-child</artifactId>
<version>${project.version}</version>
<type>pom</type>
</dependency>
</dependencies>
该声明不会带来任何新的依赖关系,因为service-child-child
已经从其父service-child
继承了所有依赖关系。
请查看Introduction to the POM - Project Inheritance,以获取有关Maven中继承和聚合的更多信息。