Maven EAR pom应该继承父对象吗
这是一个关于mavenMaven 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 当我从父级构建整个项目时
部分使用的问题,也是一个关于如何使用和EAR模块的问题
我有一个典型的用例。以下是maven模块
- 母公司
- 原料药
- ejb
- 网
- 耳朵
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] ------------------------------------------------------------------------