首页 文章

maven项目有多个父母吗?

提问于
浏览
51

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

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

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

  • my-plugin

  • my-plugin-client(flex)

  • my-plugin-server(java)

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

6 回答

  • 2

    一个项目只能有一个父项(与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元素中实际引用的插件 . 孩子们有权重写pluginManagement定义 .

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

  • 0

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

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

    • 导入的pom中定义的插件将不会导入

    • 导入的pom中定义的依赖关系不会添加到当前的pom中, it will only import dependencies into the dependency management section

    但是,如果您的父pom有一个<dependencies>部分,并且您希望将它们包含在依赖项中,那么您可以将父项添加到依赖项部分,就像常规依赖项一样:

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

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

  • 4

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

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

    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)
    
  • 20

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

    您可以拥有一个聚合器pom,它不是它聚合的项目的父级 .

    并在Maven Documentation解释

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

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

    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
    

    希望它也能帮助别人:)

  • 31

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

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

    总结一下:

    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 项目 .

  • 6

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

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

相关问题