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

vsdwdz23  于 2022-09-21  发布在  Maven
关注(0)|答案(6)|浏览(603)

我们有Java和Flex项目。我们目前有1个基本POM,其中包含我们想要用于这两个项目的配置。这样做的问题是:Flex项目继承配置,例如,javadocpmd插件,这是不可取的。

我想把它清理干净,有一个真正的底座POM,然后是一个java-base-pom和一个flex-base-pom。但是,在同时具有Flex部件和Java部件的多模块中如何工作呢?

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

  • 我的插件

  • My-Plugin-Client(Flex)

  • my-plugin-server(Java)

my-plugin仅包含带有<modules/>部分的pom.xml。我会使用my-plugin pom.xml作为这两个文件的父文件,但是我不能同时使用Java base-pom或flex base-pom作为父文件。解决这一问题的最佳方法是什么?

5ktev3wc

5ktev3wc1#

尽管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>

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

1.不会导入导入的POM中定义的插件
1.导入的POM中定义的依赖关系不会添加到当前POM中,只会将依赖关系导入到依赖关系管理部分

但是,如果您的父POM具有<dependencies>节,并且您想要将它们包括到您的依赖项中,则可以像常规依赖项一样将父项添加到<dependencies>节:

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

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

enxuqcxy

enxuqcxy2#

一个项目只能有一个父级(与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中)。这会解决你目前的问题。

lo8azlld

lo8azlld3#

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

du7egjpx4#

我也遇到了这个问题,我找到的最好的解决方案是使用继承和聚合,就像这个问题中建议的那样:does maven support multiple parents (multiple inheritance) ?
您可以拥有一个聚合器POM,该聚合器POM不是它聚合的项目的父级。

并在Maven文档中进行解释

继承和聚合通过单个高级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

希望它也能帮助其他人:)

bihw5rsg

bihw5rsg5#

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

正如我在这里所解释的,您必须区分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项目中定义的所有属性。

c8ib6hqw

c8ib6hqw6#

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

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

相关问题