Maven EAR pom应该继承父对象吗

Maven EAR pom应该继承父对象吗,maven,multi-module,Maven,Multi Module,这是一个关于maven部分使用的问题,也是一个关于如何使用和EAR模块的问题 我有一个典型的用例。以下是maven模块 母公司 原料药 ejb 网 耳朵 ear将api、ejb和web列为其依赖项,并像其他模块一样继承自parent 这是父项的依赖项管理部分 org.springframework 弹簧芯 3.4 对于ejb我有一个依赖项(不是在依赖项管理部分下,而是一个依赖项),它显式地覆盖了版本 org.springframework 弹簧芯 2.5 当我从父级构建整个项目时

这是一个关于maven
部分使用的问题,也是一个关于如何使用和EAR模块的问题

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

  • 母公司
    • 原料药
    • ejb
    • 耳朵
ear将
api
ejb
web
列为其依赖项,并像其他模块一样继承自
parent

这是父项的依赖项管理部分


org.springframework
弹簧芯
3.4

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


org.springframework
弹簧芯
2.5

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

到目前为止还不错,但问题出现在依赖关系解决的方式上。我的直觉是,因为ejb模块明确列出了SpringCoreVersion2.5,所以它将打包为依赖项。但实际情况是,作为父pom的子级的EAR模块使用父pom的依赖项管理部分中提到的版本,并最终将3.4作为spring核心版本

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

尽管有人可能会争辩说,理想情况下应该始终使用相同版本的jar,但在某些情况下,您可能会希望覆盖某些依赖项版本

什么是让我能够覆盖版本的正确方法?本例中使用spring只是出于示例目的。它可以是任何其他jar。

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

关于版本覆盖,请不要弄错,因为您可以覆盖继承的依赖项版本,只需在子模块中声明它,该子模块需要有自己的某个工件版本

下面是一个示例展示,说明了一个名为
root
的简单项目,它有两个子模块<代码>祝福模块继承父工件版本的模块和选择了自己路径的奇数模块,以及自己工件版本的模块:

root
\+ blessed-module 
 + odd-module
父pom将声明具有以下描述符(pom.xml)的集中式依赖项:

以及
奇数模块的pom.xml文件

<?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>
<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>
您将看到具有稍微不同版本的
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] ------------------------------------------------------------------------

这并不能完全描述我的情况。如果
奇数模块
祝福模块
作为其依赖项,那么在您的情况下会发生什么?如果奇数模块没有声明spring是它的依赖项?最终的结果是Spring2.5,还是3.2.8.0版本?原来是3.2.8版本!一般来说,这很好,但如果
odd模块
被证明是
EAR
模块,则会违反直觉。您不想在EAR模块中添加框架依赖项,但需要将
模块
(ejb)作为依赖项。
mvn dependency:tree
[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] ------------------------------------------------------------------------