Maven:多个父POM?

时间:2014-12-02 17:31:58

标签: maven inheritance

我有一个具有以下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继承自rootchild-n继承自parent-foo

root -> parent-foo -> child-n

这一切都很好&很好,并且适用于这个琐碎的案例。

(未来)用例

使用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 

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 repo处于不受欢迎的状态,但至少我可以将reactor构建插入我的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配置文件的解决方案就足够了。

2 个答案:

答案 0 :(得分:5)

简短回答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> 

在管理部分中,唯一的不便是您必须明确声明依赖关系,但......您所取得的成就是:

拥有不同的poms - 每个poms管理一组相关的依赖项。项目只需要导入这些poms然后使用依赖项而不用担心依赖项版本。基本上这可以保持父母的简单和精益。

答案 1 :(得分:1)

child-n项目之间的依赖关系如何?只在每个父母内部*或与父母一起 - *?

如果我在哪里,我会创建这样的东西:

/pom.xml                                    (Parent POM for all projects)

/project-foo/pom.xml                        (BOM for Project Foo. only dependencyManagement for foo-* artefacts)
/project-foo/parent/pom.xml                 (Parent POM for Project Foo. dependencyManagement for external used artifacts. ev.including import of bar BOM)
/project-foo/parent/foo-child1/pom.xml      (Child Artifact fron Project Foo)
/project-foo/parent/foo-child2/pom.xml      (Child Artifact fron Project Foo)
/project-foo/parent/foo-child3/pom.xml      (Child Artifact fron Project Foo)

/project-bar/pom.xml                        (BOM for Project Bar. only dependencyManagement for bar-* artefacts. ev.including import of foo BOM)
/project-bar/parent/pom.xml                 (Parent POM for Project Bar)
/project-bar/parent/bar-child1/pom.xml      (Child Artifact fron Project Bar)
/project-bar/parent/bar-child2/pom.xml      (Child Artifact fron Project Bar)
/project-bar/parent/bar-child2/pom.xml      (Child Artifact fron Project Bar)

我认为每个项目(Foo / Bar)都有一个连续的整合/构建工作。然后你可以将它指向你的/ project - * / pom.xml

官方maven页面链接:http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management

我希望我完全理解你的问题...