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

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

我想清理它,并有一个真正的基础pom,然后是一个和一个.但是,这在同时具有Flex部分和Java部分的多模块中是如何工作的呢?java-base-pomflex-base-pom

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

  • 我的插件
    • my-plugin-client (flex)
    • my-plugin-server (java)

my-plugin只是包含一个带部分。我会使用pom.xml作为两者的父级,但这样我也不能使用java base-pom或flex base-pom作为父级。最好的方法是什么?pom.xml<modules/>my-plugin


答案 1

即使 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 中定义的插件将不会被导入
  2. 导入的pom中定义的依赖项不会添加到当前pom中,它只会将依赖项导入依赖项管理部分

但是,如果您的父 pom 有一个部分,并且您希望将这些部分包含在依赖项中,则可以将父项添加到您的部分,就像常规依赖项一样:<dependencies><dependencies>

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

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


答案 2

一个项目只能有一个父级(与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 是一个与侧面插件一起看到的元素。插件管理以大致相同的方式包含插件元素,除了它不是为此特定项目构建配置插件信息,而是旨在配置从此构建继承的项目构建。但是,这仅配置在子级的插件元素中实际引用的插件。孩子们完全有权覆盖插件管理定义。

因此,在父 pom 中,配置插件(例如 javadoc 和 pmd),并在所需子级的元素中引用它们(此处仅在 my-plugin-server 中)。这将解决您当前的问题。pluginManagementplugins


推荐