`

maven传递依赖

阅读更多

Maven传递依赖

依赖的传递性。通过依赖设置解决了项目的CLASSPATH 问题,实际情况是我们依赖的项目其本身也是依赖其他的项目的,

如我依赖commons-email,而commons-email 需要依赖JavaMail 和JAF,这个时候,Maven 会自动处理这个依赖传递,会将JavaMail 和JAF 也会加入到CLASSPATH 中,通过这种传递地址,可以确保依赖的完整性,保证程序的正常运行。

 

maven会根据groupId和artifactId来进行依赖去重,maven最终只取一个artifact,去重多版本。(去重的依据:第一是路径最短优先,第二是声明优先),

 

如果App1依赖A,A依赖1.0 版本的F,App1 同时依赖B,B 依赖1.1 版本的F,App1 还依赖C,C 本身依赖D,D依赖1.2 版本的F,如下图:



 

那么App1 依赖哪个版本的F?

Maven在这里处理有两个机制,

第一是路径最短优先

第二是声明优先

假设我们将App1 设为根节点,那么F:1.0 距离根节点的路径为2,F:1.1也为2,F:1.2 为3,那么根据最短路径原则F:1.2 被淘汰。

在同为路径2 的F:1.0 和F1.1 之间根据声明优先原则,F:1.0是在A声明中引入的,而A 声明在先,那么F:1.0胜出,App1最终依赖的F 版本为1.0。

 

在pom.xml中dependency越下面,那么越先声明。

 

但是项目确实需要F:1.2,如何将F:1.2 加入到项目的CLASSPATH 中呢?

这里有两个方法:优先声明和依赖排除(Exclusion)。 

声明优先:

前面说到最短路径原则,如果我在App1的pom.xml声明之间依赖F:1.2,那么F:1.2与项目根节点的路径为1,而F:1.0 和F:1.1 的路径都为2,则F:1.2 胜出,项目依赖F:1.2。

依赖排除:

指在声明依赖时,指明排除对某一项目的依赖,如在依赖hibernate-core 3.3.1.GA 时,排除对slf4j-api(排除时需要指明groupId 和artifactId,不需要指明version),这样就可以断开依赖的链,依赖就不会传递下去。依赖排除声明如下:



 

回到App1 项目中,如果我们在声明A依赖时排除对F的依赖,声明B 时排除对F的依赖,那么D 依赖的F:1.2 就会胜出,项目就会依赖F:1.2 啦。 所以让App1 依赖F:1.2 的结构如下(声明优先和依赖排除选一即可):



 

说明一下,依赖去重是基于groupId和artifactId完全一致才生效的。(不需要version)

一个反面的例子,很多开发人员会问,我的WEB-INF/lib目录下怎么出现两个jdom.jar?一个是1.0的,一个1.1的。

这里说明一下: jdom 1.0的groupId 是jdom,而jdom 1.1的groupId是org.jdom,两者groupId 不一致(虽然artifactId 是一样的),无法使用依赖去重,

Maven认为这两个jar 包完全不相关,而不是一个artifact 的两个版本,所以这两个jar 包都出现在lib 目录下啦。

 

这种情况在开源项目中很常见:刚开始,一个程序员写了一个小项目,groupId直接为项目名称:com.xxx;后来越做越大,被Apache ASF 采纳,groupId 调整为org.apache.xxx;

最后觉得约束太大,又想单飞,做一个新的产品,如org.xxx。回顾这个产品,groupId 变了三次,如果设置不好,你的lib 目录下可能出现该项目的三个jar包,

iBATIS就是这个例子,groupId 分别是: com.ibatis -> org.apache.ibatis -> org.mybatis,这个一定要注意一下。

  • 大小: 55.1 KB
  • 大小: 94.4 KB
  • 大小: 76.3 KB
分享到:
评论

相关推荐

    Maven传递依赖和依赖的规则.docx

    传递依赖 当存在传递依赖的情况时,主工程对间接依赖的jar可以访问吗? 例如:A.jar依赖于B.jar,而B.jar依赖于C.jar,那么要怎么修改配置文件,才会让A.jar 也依赖 C.jar 呢? 这要看传递依赖的jar包引入时的依赖...

    ojdbc8的maven依赖

    Oracle依赖,maven依赖,ojdbc8的依赖

    Maven 依赖详细理解.pdf

    附件详细的介绍了Maven依赖在POM文件中的表示、依赖范围的含义以及传递性依赖的使用,也包含依赖调解的两个内容。

    rules_maven:具有Bazel的传递Maven依赖项

    声明一个外部工作空间,该工作空间定义了一组Maven工件的传递依赖项。 状态:试验中,但正在其他内部项目中积极使用。 用法 1.将rules_maven添加到您的WORKSPACE git_repository ( name = "org_pubref_rules_...

    depcheck-maven-plugin:Maven插件可检查已使用的未使用的直接和已使用的间接(传递)依赖项

    此目标扫描项目以查找对传递依赖项的类的引用,并将相应的依赖项作为直接依赖项添加到pom.xml中 “帮助” Maven目标 要显示在线帮助,请执行以下操作: # display available goals mvn ...

    maven_部分_源码和思维导图

    01课_maven_初步02课_maven_初步_思路讲解和archetype的使用和eclipse的安装03课_maven_依赖_环境搭建和依赖的范围04课_maven_依赖_传递性依赖的冲突的问题

    war-deps:示例项目演示 Maven 对战争依赖项的传递依赖项处理

    演示如何通过 maven-war-plugin 在 Maven 中处理战争中的传递依赖项的示例项目。 带走的消息是: 向项目添加战争依赖项不会将战争的传递依赖项添加到类路径。 为了将 war 依赖项的传递依赖项添加到类路径,必须...

    Maven入门巨无霸视频教程(2.24G)

    使用Maven核心概念介绍(坐标、依赖、仓库、插件、生命周期等)、Maven与第三方Elicpse整合及如何在Eclipse中使用Maven、什么是私服、Maven为什么...任亮系列-maven依赖传递和可选依赖和排除依赖.mp41313.任亮系列-mav

    dependency-management-plugin:一个Gradle插件,提供类似Maven的依赖项管理功能

    基于配置的依赖项管理,该插件将控制项目的直接和传递依赖项的版本,并将遵守项目依赖项poms中声明的任何排除项以及任何导入的bom。 要了解有关使用Dependency Management插件的更多信息,请参阅其。 贡献 该项目...

    尚硅谷_Maven.doc

    本课程将帮助你了解 Maven 的作用,常用命令,如何配置依赖,以及依赖的范围、依赖的传递性、依赖的排除、生命周期等重要概念,以及继承、聚合这样的 Maven 配置。更会手把手教你在 Eclipse 中玩转 Maven。

    maven系统的思维导图总结

    maven系统的思维导图总结,总结了maven的三大scope,maven的生命周期,eclipse中使用maven,maven中的依赖传递,依赖排除,继承、聚合、自动部署。

    尚硅谷Java视频教程_Maven视频

    · 01....依赖的传递性 · 28.依赖的排除 · 29.依赖的原则说明 · 30.依赖的原则测试 · 31.统一管理依赖的版本号 · 32.继承 · 33.聚合 · 34.Web工程的自动部署 · 35.查找依赖信息的网站

    dependency-metadata-maven-plugin:Maven 依赖元数据插件

    依赖元数据 Maven 插件多用途 maven 依赖元数据处理插件,旨在解析直接和可传递 maven 项目依赖项的元数据并对其采取行动。 此插件的最初用例是能够弃用内部生产的库,但绝对不限于此。 元数据被序列化为 JSON 文件...

    mabel:Bazel的Maven依赖图生成器

    马贝尔 Bazel的另一个Maven依赖图生成器。 该WORKSPACE将提供mabel_... 生成所需的Java规则(具有传递依赖项)。 自动检测要为给定依赖性创建的规则类型: aar_import用于Android工件。 用于注释处理器的java_plugin +

    maven window下安装包

    第5章:坐标和依赖/5.6 传递性依赖 第5章:坐标和依赖/5.7 依赖调解 第5章:坐标和依赖/5.8 可选依赖 第5章:坐标和依赖/5.9 最佳实践/5.9.1 排除依赖 第5章:坐标和依赖/5.9 最佳实践/5.9.2 依赖属性使用变量 第5章...

    Maven2 的新特性.7z

    在Maven2中实现了传递依赖,如此对于Hibernate所依赖的包,Maven2会自动下载,开发人员只需关心Hibernate即可。 注意:只有得到Maven支持的依赖,通常是plugin形式出现,才能获得这个特性。而且对于一些老的plugin,...

    Maven权威指南 很精典的学习教程,比ANT更好用

    Maven依赖管理 (Dependency Management) 3.5.6. 站点生成和报告 (Site Generation and Reporting) 3.6. 小结 4. 定制一个Maven项目 4.1. 介绍 4.1.1. 下载本章样例 4.2. 定义Simple Weather项目 4.2.1...

    gradle-dmt-plugin:一个Gradle插件,提供类似Maven的依赖项管理功能

    Gradle DMT插件介绍一个Gradle插件,... 基于配置的依赖项管理,该插件将控制项目的直接和传递依赖项的版本,并将遵守项目依赖项poms中声明的任何排除项以及所有导入的bom。执照Gradle DMT插件是根据发布的开源软件。

    maven-jpackage-template:示例项目,说明在使用本机安装程序的同时仍使用标准Maven依赖系统的情况下,构建基于JavaFX的小型跨平台小型桌面应用程序

    使用标准的Maven依赖系统自动管理普通的JAR依赖(包括传递Maven依赖)。 使用自动生成问题提供不错的小型安装程序的jlink / jpackage工具依赖于新的Java模块系统。 该系统很难使用,因为它期望Java库添加模块信息...

Global site tag (gtag.js) - Google Analytics