74

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

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

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

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

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

4

6 回答 6

43

即使 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>

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

于 2016-08-26T07:21:31.530 回答
40

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

于 2009-10-28T14:19:57.877 回答
6

The only way is to have base-pom as parent of java-base-pom and flex-base-pom.

I have similar structure for my spring projects:

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)
于 2009-10-28T12:17:09.703 回答
4

我也遇到了这个确切的问题,我发现最好的解决方案是使用继承和聚合,正如这个问题中所建议的那样: maven support multiple parents (multiple inheritance)?

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

并在Maven 文档中解释

继承和聚合创建了一个很好的动态来通过单个高级 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

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

于 2012-11-12T14:14:27.200 回答
3

Just image that pom.xml are in fact Java classes: you can have only one parent (or extends a class), but this parent can also have another parent, and so on.

As I explained here, you must distinguish the parent and aggregation principles in Maven, which means that my-plugin would be considered as an aggregation project, not necessarily a parent project for both my-plugin-client and my-plugin-parent.

So to summarize:

my-plugin will define the base pom for all your projects. Then, you create two new pom projects: java-base-pom and flex-base-pom. They have both my-plugin as parent. Now, my-plugin-client will have java-base-pom as parent, while my-plugin-server will use flex-base-pom for his parent.

This way, my-plugin-client will inherit all properties defined in the my-plugin pom.xml, and also from java-base-pom project.

于 2009-10-28T12:16:24.727 回答
0

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

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

于 2012-12-21T00:26:21.093 回答