大家好,我是IT修真院北京分院第13期的学员石奥林,一枚正直纯洁善良的java程序员。
今天给大家分享一下,修真院官网Java任务6————如何处理 maven 依赖冲突?
一、背景介绍
maven的依赖机制(the dependecy mechanism)。 依赖管理是对于使用maven的用户是最为熟知的特性之一,而且也是maven做的特别出色的一个领域。 对于单个项目的依赖管理没有难度,但是当要面对的是多个model的项目或者是由数十个或上百个model组成的应用时,maven可以轻松的使用户对于依赖用更高的控制和稳定性。 依赖传递:通过自动加载,避免了需要用户自己去发现和指定项目中所依赖的库。 这个特性通过阅读依赖在远程仓库的项目档案而得到简化。通常来说,项目中所使用的依赖的是继承自父项目或者是它的依赖等等。 maven对于组合依赖的层数是没有限制的,唯一可能导致问题的是存在一个循环依赖。 正是由于依赖传递,包含库的图表将会快速的增大到相当大的规模,对此maven提供了一些额外的特性来限制哪些依赖可以包含进来。 2.知识剖析 这些特性是:依赖仲裁(dependency meditation),依赖管理(dependency managenent),依赖范围(dependency scope),排除依赖(excluded dependencies),可选依赖(optional dependencies)。 dependency meditation 将会决定当遇到同一个artifact有多个version是会用那个版本。 依赖管理(dependency management)允许项目的作者在遇到依赖传递或者是遇到没有指定版本的依赖的情况时,可以直接要使用的版本。 Dependency scope 允许用户只在某个阶段中包含某个依赖。
二、知识剖析
maven的依赖机制(the dependecy mechanism)。
依赖管理是对于使用maven的用户是最为熟知的特性之一,而且也是maven做的特别出色的一个领域。
对于单个项目的依赖管理没有难度,但是当要面对的是多个model的项目或者是由数十个或上百个model组成的应用时,maven可以轻松的使用户对于依赖用更高的控制和稳定性。
Maven采用“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突。换句话说,如果一个项目依赖于相同artifact的多个版本,在“依赖树”中离项目最近的那个版本将被使用。
三、常见问题
如何解决maven例来冲突?
四,解决方案
现在有一个web应用resolve-web。
4个jar包:project-A,project-B,project-C,project-Common。
添加方法排除依赖
<dependency>
<groupId>project-A</groupId>
<artifactId>project-A</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>project-common</groupId>
<artifactId>project-commmon</artifactId>
</exclusion>
</exclusions>
</dependency>
课后讨论:
问题1:
怎么查看依赖树呢?
答:可以使用在resolve-web中执行"mvn dependency:tree -Dverbose"可以看到resolve-web的依赖关系
问题2:如何避免依赖冲突呢。
答:最好都显式的引入最新的版本依赖
问题3:依赖冲突常见吗?
答:以我们现在的任务应该不会出现依赖冲突,依赖冲突是有多项目组成的工程才会出现。