我有一个多模块的foo
项目,其POM结构如下:
Foo
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
Foo POM继承
这种标准的父子关系是parent-foo
从root
继承,而child-n
从parent-foo
继承。
root -> parent-foo -> child-n
这些都很好,并且对于这个简单的案例可以正常工作。
(未来)用例
使用parent-foo
适用于基于foo
的旧有用例,但也要测试我们正在迁移的未来用例:bar
。
Bar
Bar POM结构
/pom.xml (root POM)
/parent-bar/pom.xml (a parent with 'bar' dependencies & configurations)
/child-1/pom.xml
...
/child-n/pom.xml
Bar POM 继承
root -> parent-bar -> child-n
问题
我是否可以实现以下的反应堆构建,而不必每次修改child-n
POM时都要进行一些变通?或者说有没有类似的解决方案?或者说,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] ------------------------------------------------------------
理想情况下,我希望将所有内容放在一个反应堆构建中,每个“child-n”都编译并使用每个“parent-*”继承的依赖项。我知道这会使我的Maven仓库处于不良状态,但至少我可以将反应堆构建插入我的CI中,并确保我的构建在“parent-*”依赖平台上运行。
当前解决方法
目前的解决方法是修改所有“child-n” POM的父级,如下所示:# 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
编辑 1:
- 注意到
root
POM实质上是“祖父”POM,根据@OhadR的评论。 - 注意到'foo'和'bar'不仅提供依赖继承,还提供构建配置--如果它们只提供了依赖项,则基于Maven配置文件的解决方案就足够了。
root
确实是祖父。每个父级(foo、bar)都有一个完整的构建配置要继承(例如:一个JDK6,另一个JDK8),除了独立的依赖项。目标是拥有共同的+共享的根、共同的+共享的子代和独立/中间的父代,以便它们可以将其构建/配置传递给子代。祖父是一个单一的静态实体,不能单独实现该解决方案(没有修改)。 - JJ Zabkar