我们有java和flex项目在起作用。我们目前有1个基本pom,其中包含我们要用于两个项目的配置。问题是:flex项目继承javadoc和pmd的配置,例如,他们不想要。
我想要做得更干净,有一个真正的基础,然后是一个java-base-pom和一个flex-base-pom。但是如何在具有flex部分和java部分的多模块中工作呢?
我们有自己的应用程序的插件,我们使用以下结构:
my-plugin只包含一个带有section的pom.xml。我会使用my-plugin pom.xml作为两者的父级,但是我也不能将java base-pom或flex base-pom也用作父级。对此最好的评价是什么?
答案 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>
与父母相比,这有两个重要的区别:
但是,如果您的父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,它不是项目的父项 聚集体。
继承和聚合通过单个高级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-pom
和flex-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配置的多重继承。