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>
与父母相比,这有两个重要的区别:
- 在导入的pom中定义的插件不会被导入
- 在导入的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-pom
和flex-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。