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

Posted

技术标签:

【中文标题】maven项目可以有多个父项吗?【英文标题】:Can maven projects have multiple parents? 【发布时间】:2010-12-10 20:14:53 【问题描述】:

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

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

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

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

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

【问题讨论】:

我想我在***.com/questions/57449258/…问知道类似的问题 【参考方案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>

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

    在导入的 pom 中定义的插件不会被导入 导入的 pom 中定义的依赖不会添加到当前 pom,只会将依赖导入到依赖管理部分

但是,如果您的父 pom 有一个 &lt;dependencies&gt; 部分并且您希望将它们包含到 您的 依赖项中,那么您可以像常规依赖项一样将父项添加到您的 &lt;dependencies&gt; 部分:

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

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

【讨论】:

添加 pom 应该解决 Eclipse 中的问题,如果只有依赖包含父 pom 构成任何 是否可以从导入的 pom 中包含插件?【参考方案2】:

我也遇到过这个确切的问题,我发现的最佳解决方案是按照这个问题的建议使用继承和聚合:does maven support multiple parents (multiple inheritance) ?

您可以拥有一个不是其项目父级的聚合器 pom 聚合。

并在Maven Documentation中解释

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

从这里我继承了我的 POM(pom-master 包含公社配置,每个孩子都有具体的配置):

pommaster |-- pom-java |-- pom-flex

所以我的项目可以根据需要获得每个模块配置的细节:

项目(聚合项目-flex 和项目-java) |-- 项目-java | `-- pom.xml => 父级 = pom-java |-- 项目弹性 | `-- pom.xml ==> 父级 = pom-flex `-- pom.xml => 父级 = pom-master

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

【讨论】:

您好,请问maven-site-plugin 和maven-release-plugin 这个结构如何设置?【参考方案3】:

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

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

【讨论】:

这并不理想,因为子项目无法控制父 POM 中定义的配置文件的激活。 这与继承无关。但是您可以使用它们来设置一些参数以通过开关打开/关闭(启用/禁用配置文件)。【参考方案4】:

一个项目只能有一个父级(与 C++ 中的多重继承不同),但这个父级可以是更大父级层次结构的一部分。正如其他人指出的那样,您可能会拥有这样的东西:

基础-pom/ |-- flex-base-pom | |-- 我的插件客户端 | | `-- pom.xml | `-- pom.xml |-- java-base-pom | |-- 我的插件服务器 | | `-- pom.xml | `-- pom.xml `-- pom.xml

也就是说,我注意到您写道,您的实际问题是:

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

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

pluginManagement 是一个与侧面插件一起出现的元素。插件管理以几乎相同的方式包含插件元素,除了不是为这个特定的项目构建配置插件信息,它旨在配置从这个项目继承的项目构建。但是,这仅配置子级中 plugins 元素中实际引用的插件。孩子们有权覆盖 pluginManagement 定义。

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

【讨论】:

感谢您的回答,但就像我在对另一个答案的评论中所说的那样,这不是我可以使用的结构。如果没有其他弹出,那么 pluginManagement 可能是唯一的方法。缺点是我无法对所有 java 项目强制执行 PMD,因为它仅在 pluginManagement 中,并且项目本身必须将其添加到他自己的插件部分。 接受这个作为答案。以 Maven 的当前状态,使用 pluginManagement 将是最好的解决方案。【参考方案5】:

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

【讨论】:

同意。无论如何,多个父母将如何工作 - 如果父母双方都有冲突的财产会发生什么? child 会覆盖 parent,所以 java-base-pom 中的设置会覆盖 base-pom 的设置,child1 会覆盖 java-base-pom 的设置等。这样 java-base-pom 和 flex -base-pom 是不相关的。 我在做多层次的层次结构时遇到了困难——在我的第三层(类似于你的 spring-webapp-base_pom)上,父级的 pluginManagement 部分被完全省略了。任何想法为什么会发生这种情况?【参考方案6】:

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

正如我解释的here,你必须区分Maven中的父和聚合原则,这意味着my-plugin将被视为一个聚合项目,不一定是my-plugin-client和my-的父项目插件父级。

总结一下:

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 项目中继承。

【讨论】:

也许我没有让自己足够清楚。基础 pom 应该位于层次结构的根部,因为应用程序本身也依赖于它,或者我们构建的任何其他 java 模块。只是旁边我也有这个插件结构,需要 2 个父母,但这似乎是不可能的。

以上是关于maven项目可以有多个父项吗?的主要内容,如果未能解决你的问题,请参考以下文章

Maven 可以重新签署依赖项吗?

如何在 maven pom.xml 文件中拥有另一个父依赖项以及 Spring Boot 父项?

我们可以在 selenium 中添加驱动程序作为 maven 依赖项吗

maven 会自动下载工件依赖项吗?

Maven + Spring Boot + JPA + Hibernate 项目有问题吗?

我可以使用 Apache Felix Maven Bundle Plugin 声明像私有包这样的依赖项吗?