【问题标题】:Should the EAR pom inherit a parentEAR pom是否应该继承父母
【发布时间】:2014-07-25 05:11:23
【问题描述】:

这既是关于使用 maven <dependencymanagement> 部分的问题,也是关于 EAR 模块应该如何发挥作用的问题。

我有一个典型的用例。以下是maven模块

  • 父级
    • API
    • ejb
    • 网络
    • 耳朵

ear 将 apiejbweb 列为其依赖项,并像其他模块一样从 parent 继承。

这里是parent 的依赖管理部分。

<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.4</version> </dependency> </dependencyManagement>

对于ejb,我有一个显式覆盖版本的依赖项(不在依赖项管理部分,而是一个依赖项)。

<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>2.5</version> </dependency>

当我从父级构建整个项目时(因为它们在父级 pom 中聚合),EAR 项目会创建最终的 EAR 工件。

到目前为止一切都很好,但问题出现在依赖关系解决的方式上。我的直觉是,因为 ejb 模块明确列出了 spring 核心版本 2.5,所以它会被打包为依赖项。但实际发生的情况是,作为父 pom 的 child 的 EAR 模块使用父 pom 的 dependency management 部分中提到的版本,最终将 3.4 作为 spring核心版本。

经过大量研究,我确信这符合 Maven 文档。但是我现在想的是,如果我将让父 pom 控制所有依赖版本的策略与继承父模块的 EAR 模块的策略结合起来,我基本上会“卡住”(在某些情况下)父定义的没有有机会覆盖它。

虽然有人可能会争辩说,理想情况下应该始终使用相同版本的 jar,但在某些情况下,您会遇到想要覆盖某些依赖版本的情况。

让我能够覆盖某个版本的正确方法是什么?本示例中使用弹簧只是为了示例目的。它可以是任何其他罐子。

【问题讨论】:

    标签: maven multi-module


    【解决方案1】:

    Dependency Management 实际上允许您集中管理依赖版本,而无需在所有子项中添加依赖(谈论公共依赖)。当拥有多继承级别的项目时,这带来了很大的帮助,其中子项目可以像您的项目一样从父 pom 获取传递依赖项。

    关于版本覆盖,请不要误会,因为您可以覆盖继承的依赖版本,只需在需要拥有自己版本的某些工件的子模块中声明它即可。

    这是一个示例展示,说明了一个名为 root 的简单项目,并具有两个子模块; blessed-module 继承了他的父神器版本和一个odd-module 选择了他自己的路径和他自己的神器版本:

    root
    \+ blessed-module 
     + odd-module
    

    父 pom 将声明具有以下描述符 (pom.xml) 的集中式依赖项:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>dependency.management.showcase</groupId>
      <artifactId>root</artifactId>
      <packaging>pom</packaging>
      <version>1.0</version>
    
      <modules>
        <module>blessed-module</module>
        <module>odd-module</module>
      </modules>
    
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.2.8.RELEASE</version>
          </dependency>
        </dependencies>
      </dependencyManagement>
    
    </project>
    

    子模块如下,以blessed-module开头:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <parent>
        <groupId>dependency.management.showcase</groupId>
        <artifactId>root</artifactId>
        <version>1.0</version>
      </parent>
    
      <artifactId>child-module</artifactId>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
        </dependency>
      </dependencies>
    
    </project>
    

    odd-modulepom.xml文件:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <parent>
        <artifactId>root</artifactId>
        <groupId>dependency.management.showcase</groupId>
        <version>1.0</version>
      </parent>
    
      <artifactId>odd-module</artifactId>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>2.5</version>
        </dependency>
      </dependencies>
    
    </project>
    

    现在不需要进一步的操作,只需导航到 root 主路径并从终端执行以下 maven 命令,即可将所有依赖关系树显示在您面前

    mvn dependency:tree
    

    您将看到 spring-core 工件版本略有不同的子模块:

    [INFO] ------------------------------------------------------------------------
    [INFO] Building root 1.0
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ root ---
    [INFO] dependency.management.showcase:root:pom:1.0
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building child-module 1.0
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ child-module ---
    [INFO] dependency.management.showcase:blessed-module:jar:1.0
    [INFO] \- org.springframework:spring-core:jar:3.2.8.RELEASE:compile
    [INFO]    \- commons-logging:commons-logging:jar:1.1.3:compile
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building odd-module 1.0
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ odd-module ---
    [INFO] dependency.management.showcase:odd-module:jar:1.0
    [INFO] \- org.springframework:spring-core:jar:2.5:compile
    [INFO]    \- commons-logging:commons-logging:jar:1.1:compile
    [INFO] ------------------------------------------------------------------------
    

    【讨论】:

    • 这并不能完全描述我的情况。如果odd moduleblessed-module 作为其依赖项,您的情况会发生什么?如果odd module 没有将spring 声明为其依赖项?最终结果会是您所期望的 spring 2.5 还是来自父级的 3.2.8.RELEASE?原来是 3.2.8.RELEASE!一般来说,这会很好,但如果 odd module 原来是 EAR 模块,则会违反直觉。您不想在 EAR 模块中添加 框架依赖项,但需要将 blessed-module (ejb) 作为依赖项。
    猜你喜欢
    • 2021-07-12
    • 2012-03-17
    • 1970-01-01
    • 2013-09-28
    • 2019-10-16
    • 2013-09-26
    • 2012-12-22
    • 2017-02-22
    • 2016-12-17
    相关资源
    最近更新 更多