maven项目有多个父母吗?

时间:2009-10-28 11:54:41

标签: java flex maven-2 code-organization

我们有java和flex项目在起作用。我们目前有1个基本pom,其中包含我们要用于两个项目的配置。问题是:flex项目继承javadoc和pmd的配置,例如,他们不想要。

我想要做得更干净,有一个真正的基础,然后是一个java-base-pom和一个flex-base-pom。但是如何在具有flex部分和java部分的多模块中工作呢?

我们有自己的应用程序的插件,我们使用以下结构:

  • MY-插件
    • my-plugin-client(flex)
    • my-plugin-server(java)

my-plugin只包含一个带有section的pom.xml。我会使用my-plugin pom.xml作为两者的父级,但是我也不能将java base-pom或flex base-pom也用作父级。对此最好的评价是什么?

6 个答案:

答案 0 :(得分:33)

项目只能有一个父项(与C ++中的多重继承不同),但此父项可以是更大的父层次结构的一部分。正如其他人所指出的,你可以这样做:

base-pom/
|-- flex-base-pom
|   |-- my-plugin-client
|   |   `-- pom.xml
|   `-- pom.xml
|-- java-base-pom
|   |-- my-plugin-server
|   |   `-- pom.xml
|   `-- pom.xml
 `-- pom.xml

那就是说,我注意到你写道,你的实际问题是:

  

flex项目继承javadoc和pmd的配置,例如,他们不想要。

您应该使用pluginManagement元素来避免这种情况:

  

pluginManagement 是一个沿侧插件看到的元素。插件管理以大致相同的方式包含插件元素,除了不是为这个特定的项目构建配置插件信息,它旨在配置从这个继承的项目构建。但是,这仅配置在子节点的plugins元素中实际引用的插件。孩子们有权覆盖插件管理定义。

因此,在父pom中,在pluginManagement(例如javadoc和pmd)中配置插件,并在所需子节点中的plugins元素内引用它们(仅在my-plugin-server中)这里)。这将解决您当前的问题。

答案 1 :(得分:20)

即使maven项目有单亲,他们也可以导入任意数量的其他pom:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>my-shared-dependencies</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

与父母相比,这有两个重要的区别:

  1. 导入的pom中定义的插件不会导入
  2. 导入的pom中定义的依赖关系不会添加到当前的pom中,它只会将依赖关系导入依赖关系管理部分
  3. 但是,如果您的父pom有&lt;依赖&GT;部分,并且您希望将它们包含在依赖项中,然后您可以将父项添加到依赖项部分,就像常规依赖项一样:

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>my-shared-dependencies</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    

    即使已导入相同的依赖项,也必须再次指定版本标记。为了减少重复,可以将其存储在属性

答案 2 :(得分:6)

唯一的方法是将base-pom作为java-base-pom和flex-base-pom的父级。

我的春季项目有类似的结构:

base-pom (basic configuration - eclipse, reports, repositories, etc)
|
+ spring-base-pom (spring definitions)
  |
  + spring-jar-base-pom (jar specific definitions)
  |
  + spring-war-base-pom (spring web and servlet dependencies)
    |
    + spring-webapp-base_pom (spring web mvc dependencies)

答案 3 :(得分:4)

我也遇到了这个确切的问题,我找到的最佳解决方案是在这个问题中使用继承和聚合作为建议:does maven support multiple parents (multiple inheritance) ?

  

您可以拥有一个聚合器pom,它不是项目的父项   聚集体。

并在Maven Documentation

中解释
  

继承和聚合通过单个高级POM创建一个很好的动态来控制构建(...)相反,POM项目可以聚合不从它继承的项目。

从此我得到了我的POMs继承(pom-master包含公社配置,每个孩子都有具体的配置):

pom-master
  |-- pom-java
  |-- pom-flex

所以我的项目可以根据需要获得每个模块配置的细节:

project (aggregate project-flex & project-java)
  |-- project-java
  |      `-- pom.xml => parent = pom-java
  |-- project-flex
  |       `-- pom.xml ==> parent = pom-flex
  `-- pom.xml => parent = pom-master

希望它也能帮助别人:)

答案 4 :(得分:2)

只是pom.xml实际上是Java类的图像:你只能有一个父类(或者扩展一个类),但是这个父类也可以有另一个父类,依此类推。

正如我解释here,您必须区分Maven中的父和聚合原则,这意味着my-plugin将被视为聚合项目,不一定是my-plugin-client和my-plugin-client的父项目。我的-插件母体。

总结一下:

my-plugin将为您的所有项目定义基础pom。然后,您创建两个新的 pom 项目:java-base-pomflex-base-pom。他们都有my-plugin作为父母。现在,my-plugin-client将java-base-pom作为父级,而my-plugin-server将使用flex-base-pom作为其父级。

这样,my-plugin-client将继承my-plugin pom.xml和java-base-pom项目中定义的所有属性。

答案 5 :(得分:0)

您可以使用配置文件实现多重继承:

您可以在根pom中创建(多个)配置文件,并自动激活这些配置文件的任何变体,从而实现maven配置的多重继承。