我有一个foo具有以下POM结构的多模块项目:
/pom.xml (root/'grandparent' POM)
/parent-foo/pom.xml (a parent with 'foo' dependencies & configurations)
/child-1/pom.xml
...
/child-n/pom.xml
Run Code Online (Sandbox Code Playgroud)
这个标准的父子关系parent-foo继承自root,child-n继承自parent-foo.
root -> parent-foo -> child-n
Run Code Online (Sandbox Code Playgroud)
这一切都很好,并且适用于这个简单的案例.
使用parent-foo作品为foo基础的传统使用的情况下,也考验,我们要迁移过以后的使用情况:bar.
/pom.xml (root POM)
/parent-bar/pom.xml (a parent with 'bar' dependencies & configurations)
/child-1/pom.xml
...
/child-n/pom.xml
Run Code Online (Sandbox Code Playgroud)
root -> parent-bar -> child-n
Run Code Online (Sandbox Code Playgroud)
我是否可以实现以下反应堆构建,而无需每次都修改child-nPOM 的解决方法?或者,类似的东西?或者,Maven是否只是这个用例的错误工具?
[INFO] ------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] root ............................................... SUCCESS
[INFO] parent-foo ......................................... SUCCESS
[INFO] child-1 ............................................ SUCCESS (foo parent)
[INFO] ...
[INFO] child-n ............................................ SUCCESS (foo parent)
[INFO] parent-bar ......................................... SUCCESS
[INFO] child-1 ............................................ SUCCESS (bar parent)
[INFO] ...
[INFO] child-n ............................................ SUCCESS (bar parent)
[INFO] ------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想将它全部放在一个反应器构建中,每个构建器都child-n使用每个parent-*继承的依赖项进行编译和使用.我知道这会让我的Maven repo处于不受欢迎的状态,但至少我可以将reactor构建器插入我的CI并确保我的构建在两个parent-*依赖平台上运行.
目前的解决方法是修改所有child-nPOM的父母,以便:
# 1. modify all child-n POMs
# Old:
root -> parent-foo -> child-n
# New:
root -> parent-bar -> child-n
2. Run reactor build effective with 'root -> parent-bar -> child-n' dependency tree
Run Code Online (Sandbox Code Playgroud)
root根据@ OhadR的评论,着名的POM基本上是"祖父母"POM.简短回答Maven不支持多重继承,它通过使用依赖关系管理部分中的"import"范围间接支持该概念
<dependencyManagement>
<dependencies>
<dependency>
<groupId>other.pom.group.id</groupId>
<artifactId>other-pom-artifact-id</artifactId>
<version>SNAPSHOT</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)
作为管理部分,唯一的不便是您必须明确声明依赖关系,但是......您所取得的成就是:
拥有不同的poms - 每个poms管理一组相关的依赖关系.项目只需要导入这些poms然后使用依赖项而不用担心依赖项版本.基本上这使父母poms保持简单和精益.