Maven:多个父POM?

JJ *_*kar 7 inheritance maven

我有一个foo具有以下POM结构的多模块项目:

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)

Foo POM继承

这个标准的父子关系parent-foo继承自root,child-n继承自parent-foo.

root -> parent-foo -> child-n
Run Code Online (Sandbox Code Playgroud)

这一切都很好,并且适用于这个简单的案例.

(未来)用例

使用parent-foo作品为foo基础的传统使用的情况下,也考验,我们要迁移过以后的使用情况: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 
Run Code Online (Sandbox Code Playgroud)

Bar POM继承

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)

编辑1:

  • root根据@ OhadR的评论,着名的POM基本上是"祖父母"POM.
  • 注意到'foo'和'bar'不仅仅是依赖继承提供者; 它们还提供构建配置 - 如果它们只提供了依赖关系,那么基于Maven配置文件的解决方案就足够了.

Jun*_*Liu 8

简短回答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保持简单和精益.