Java maven项目可以有多个父项目吗?

Java maven项目可以有多个父项目吗?,java,apache-flex,maven-2,code-organization,Java,Apache Flex,Maven 2,Code Organization,我们有Java和Flex项目。我们目前有1个基本pom,其中包含我们希望用于这两个项目的配置。问题是:Flex项目继承了配置,例如javadoc和pmd插件,这是不可取的 我想把它清理干净,得到一个真正的基本pom,然后是一个java基本pom和一个flex基本pom。但是,在同时具有Flex部分和Java部分的多模块中,这是如何工作的呢 我们有自己应用程序的插件,其中我们使用以下结构: 我的插件 我的插件客户端(flex) 我的插件服务器(java) my plugin只包含一个带有部

我们有Java和Flex项目。我们目前有1个基本pom,其中包含我们希望用于这两个项目的配置。问题是:Flex项目继承了配置,例如
javadoc
pmd
插件,这是不可取的

我想把它清理干净,得到一个真正的基本pom,然后是一个
java基本pom
和一个
flex基本pom
。但是,在同时具有Flex部分和Java部分的多模块中,这是如何工作的呢

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

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

my plugin
只包含一个带有
部分的
pom.xml
。我会使用
myplugin
pom.xml作为两者的父级,但是我不能同时使用java base pom或flex base pom作为父级。最好的方法是什么?

想象一下,
pom.xml
实际上是Java类:您只能有一个父级(或扩展一个类),但这个父级也可以有另一个父级,依此类推

正如我所解释的,您必须区分Maven中的父级和聚合原则,这意味着我的插件将被视为聚合项目,而不一定是插件客户端和插件父级的父级项目

因此,总结一下:

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


这样,我的插件客户端将继承
my plugin
pom.xml中定义的所有属性,以及
java-base-pom
项目中定义的所有属性。

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

一个项目只能有一个父级(与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
<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.xml |`--pom.xml |--基于java的pom ||--我的插件服务器 ||`--pom.xml |`--pom.xml `--pom.xml 也就是说,我注意到你写道,你的实际问题是:

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

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

插件管理是一个可以在插件旁边看到的元素。插件管理包含插件元素的方式与此基本相同,不同之处在于它不是为这个特定的项目构建配置插件信息,而是配置从这个项目构建继承的项目构建。但是,这仅配置在子元素的plugins元素中实际引用的插件。孩子们完全有权推翻插件管理的定义


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

我也解决了这个问题,我找到的最佳解决方案是使用继承和聚合,正如在这个问题中所建议的:

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

并在

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

由此我获得了我的POMs继承(pom主节点包含社区配置,每个子节点包含具体的配置):

pom主机 |--pom java |--聚甲醛弹性体 因此,我的项目可以根据需要获得每个模块配置的详细信息:

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 项目(聚合项目flex和项目java) |--java项目 |`--pom.xml=>parent=pomjava |--flex项目 |`--pom.xml==>parent=pom-flex `--pom.xml=>parent=pom master
希望它也能帮助其他人:)

您可以通过配置文件实现多重继承:


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

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

base-pom/ |-- flex-base-pom | |-- my-plugin-client | | `-- pom.xml | `-- pom.xml |-- java-base-pom | |-- my-plugin-server | | `-- pom.xml | `-- pom.xml `-- pom.xml
<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>

org.example
我的共享依赖项
0.0.1-快照
聚甲醛
进口
与父母相比,这有两个重要区别:

  • 导入的pom中定义的插件将不会被导入
  • 导入的pom中定义的依赖项不会添加到当前pom,它只会将依赖项导入依赖项管理部分
  • 但是,如果您的父pom有一个
    部分,并且您希望将这些部分包括到依赖项中,那么您可以像常规依赖项一样将父pom添加到
    部分:

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>my-shared-dependencies</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    
    
    org.example
    我的共享依赖项
    0.0.1-快照
    

    即使已导入相同的依赖项,也必须再次指定版本标记。为了减少重复,可以将其存储在约定的属性中。多个父级是如何工作的?如果两个父级都有冲突的属性,会发生什么情况?子级覆盖父级,因此java base pom中的设置将覆盖base pom的设置,child1将覆盖java base pom的设置,等等。这样,java base pom