maven项目有多个父母吗?

Wim*_*uwe 57 java apache-flex maven-2 code-organization

我们有java和flex项目在起作用.我们目前有1个基本pom,其中包含我们要用于两个项目的配置.问题是:flex项目继承javadoc和pmd的配置,例如,他们不想要.

我想要做得更干净一点,有一个真正的基础,然后是一个java-base-pom和一个flex-base-pom.但是,如何在具有flex部分和java部分的多模块中工作?

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

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

my-plugin只包含一个带有section的pom.xml.我会使用my-plugin pom.xml作为两者的父级,但是我也不能将java base-pom或flex base-pom也用作父级.对此最好的评价是什么?

Pas*_*ent 33

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


Pet*_*nto 26

即使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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

<dependency>
    <groupId>org.example</groupId>
    <artifactId>my-shared-dependencies</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

  • 添加 &lt;type&gt;pom&lt;type&gt; 应该可以解决 Eclipse 中的问题,如果只有依赖包含父 pom 构成任何问题 (2认同)

Dav*_*itz 6

唯一的方法是将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)
Run Code Online (Sandbox Code Playgroud)


LE *_*oît 5

我也遇到了这个确切的问题,我发现的最佳解决方案是使用继承和聚合,如这个问题所示: maven 支持多个父级(多重继承)吗?

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

并在Maven 文档中进行解释

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

由此我获得了 POM 继承(pom-master 包含公社配置,每个子节点都有具体的配置):

pom大师
  |-- pom-java
  |-- pom-flex

因此我的项目可以根据需要获取每个模块配置的详细信息:

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

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