Maven项目可以有多个父母吗?

我们有java和flex项目在工作。 我们目前有1个基地包含我们想要用于这两个项目的configuration。 与此问题是:flex项目inheritancejavadoc和pmd的configuration,例如,他们不需要。

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

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

  • 我-插件
    • 我的插件客户端(flex)
    • 我的插件服务器(Java)

my-plugin只包含一个包含section的pom.xml。 我将使用my-plugin pom.xml作为父项,但是我不能同时使用java base-pom或flex base-pom作为父项。 什么是最好的审查呢?

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

基,聚甲醛/
 |  -  flex-base-pom
 |  |  - 我的插件客户端
 |  |  ` -  pom.xml
 |  ` -  pom.xml
 |  -  java-base-pom
 |  |  - 我的插件服务器
 |  |  ` -  pom.xml
 |  ` -  pom.xml
  ` -  pom.xml

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

flex项目inheritancejavadoc和pmd的configuration,例如,他们不想要。

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

pluginManagement是一个可以在side插件中看到的元素。 插件pipe理包含插件元素的方式非常相似,除了不是为这个特定的项目构buildconfiguration插件信息,而是为了configuration从这个插件inheritance的项目构build。 但是,这只能configuration实际上在子节点的插件元素中引用的插件。 孩子们有权利覆盖pluginManagement定义。

因此,在父pom中,将插件configuration在pluginManagement (例如javadoc和pmd)中,并在所需子项的plugins元素中引用它们(仅在我的插件服务器中)。 这将解决您当前的问题。

唯一的方法是把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) 

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

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

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

  1. 在导入的pom中定义的插件不会被导入
  2. 在导入的pom中定义的依赖项不会被添加到当前的pom中, 它只会将依赖项导入到依赖项pipe理部分

但是,如果你的父pom有一个<dependencies>部分,并且你想把它们包含到你的依赖关系中,那么你可以像依赖关系一样将父对象添加到依赖关系部分:

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

即使已经导入了相同的依赖关系,版本标签也必须重新指定。 为了减less重复,可以将其存储在一个属性中

我也交叉这个确切的问题,我发现最好的解决scheme是使用inheritance和聚合在这个问题的build议: maven是否支持多个父母(多重inheritance)?

你可以有一个聚合器不是它聚合的项目的母公司。

并在Maven文档中解释

inheritance和聚合创build一个很好的dynamic来控制通过一个单一的,高层次的POM(…)相反,一个POM项目可能会聚合不从它inheritance的项目。

从这里我得到了我的POMsinheritance(pom-master包含communesconfiguration,并且每个孩子都是特定的):

 POM-主
   |  -  pom-java
   |  -  pom-flex

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

项目(聚合project-flex&project-java)
   |  -  project-java
   |  ` -  pom.xml => parent = pom-java
   |  -  project-flex
   |  ` -  pom.xml ==> parent = pom-flex
   ` -  pom.xml => parent = pom-master

希望它能帮助别人:)

就像pom.xml实际上是Java类:你可以只有一个父类(或扩展一个类),但是这个父类也可以有另一个父类,等等。

正如我在这里解释的那样,你必须区分Maven中的父项和汇总原则,这意味着我的插件将被视为一个汇总项目,不一定是我的插件客户端和我的插件父项的父项目。

所以总结一下:

my-plugin将为您的所有项目定义基本的POM。 然后,创build两个新的pom项目: java-base-pomflex-base-pom 。 他们有my-plugin作为父母。 现在,我的插件客户端将java-base-pom作为父项,而我的插件服务器将为他的父项使用flex-base-pom

这样,我的插件客户端将inheritancemy-plugin pom.xml中定义的所有属性,也从java-base-pom项目中inheritance。

您可以使用configuration文件实现多重inheritance:

您可以在根目录下创build(多个)configuration文件,并自动激活这些configuration文件的任何变化,从而实现mavenconfiguration的多重inheritance。