使用maven的程序员都会遇到一个问题,那就是maven依赖冲突的问题,这会导致ClassNotFound或者MethodNotFound这样的异常。其实只要明白maven依赖的根本性的原则就不怕这样的问题了。

一、maven依赖原则
1.间接依赖路径最短优先
一个项目test依赖了a和b两个jar包。其中a-b-c1.0 , d-e-f-c1.1 。由于c1.0路径最短,所以项目test最后使用的是c1.0。

2.pom文件中申明顺序优先
有人就问了如果 a-b-c1.0 , d-e-c1.1 这样路径都一样怎么办?其实maven的作者也没那么傻,会以在pom文件中申明的顺序那选,如果pom文件中先申明了d再申明了a,test项目最后依赖的会是c1.1

所以maven依赖原则总结起来就两条:路径最短,申明顺序其次。

二、如何解决Jar冲突
遇到冲突的时候第一步要找到maven加载的到时是什么版本的jar包。通过mvn dependency:tree查看依赖树。

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ web-hsf ---
[INFO] com.lubby:web-hsf:war:0.0.-SNAPSHOT
[INFO] +- org.apache.geronimo.specs:geronimo-servlet_3.0_spec:jar:1.0:compile
[INFO] +- org.springframework:spring:jar:2.5.:compile
[INFO] | \- commons-logging:commons-logging:jar:1.1.:compile
[INFO] +- com.taobao.hsf:hsf.dubbo.schema:jar:2.1.1.1:provided
[INFO] +- com.taobao.hsf:hsf.service.dubbo:jar:2.0.1.9:provided
[INFO] | +- com.taobao.hsf:hsf.services:jar:2.0.1.9:provided
[INFO] | | +- org.slf4j:slf4j-api:jar:1.7.:provided
[INFO] | | +- groovy:groovy-all:jar:1.1-rc-:provided
[INFO] | | \- com.taobao.noah:noah-log:jar:0.0.-SNAPSHOT:provided
[INFO] | \- com.taobao.hsf:hsf.app.spring:jar:2.0.1.9:provided
[INFO] | +- org.slf4j:slf4j-log4j12:jar:1.7.:provided
[INFO] | +- log4j:log4j:jar:1.2.:provided
[INFO] | +- commons-cli:commons-cli:jar:1.0:provided
[INFO] +- com.taobao.hsf:hsf-standalone:jar:2.0.-SNAPSHOT:provided
[INFO] | \- javax.servlet:servlet-api:jar:2.5:provided
[INFO] \- com.ali.unit.rule:unitrouter:jar:1.0.:provided
[INFO] \- com.taobao.diamond:diamond-client:jar:3.6.:provided
[INFO] \- com.taobao.diamond:diamond-utils:jar:3.1.:provided
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: .407s
[INFO] Finished at: Thu May :: CST
[INFO] Final Memory: 9M/265M
[INFO] ------------------------------------------------------------------------

遇到冲突的时候通过maven的依赖原则来调整坐标在pom文件的申明顺序是最好的办法。

方法二:依赖设置为全局使用

三、如何隔离一个Jar包
如何隔离一个jar包?有两个方法。
第一个很常用的exclusion来隔离jar包。

<exclusions>
<exclusion>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
</exclusion>
</exclusions>

第二个不常用的方法就是创建一个空包。
空包的坐标和你需要隔离的Jar包坐标一样,deploy的公司的私服上面。项目中这个空包申明在pom文件靠前的地方,这样依据maven依赖原则,这个空包会优先被使用,后面所有无论是直接依赖还是间接依赖的相同坐标的jar包都不会被使用了。
空包比exclusion的好处就是不用在所有间接依赖的地方去exclusion。

maven依赖顺序原则的更多相关文章

  1. maven 依赖调解

    项目A有两条依赖关系  A->B->C->X(1.0),A->D->X(2.0) ,X是A的传递性依赖,但是两条路径上有两个版本的依赖,会选择哪个呢? maven 依赖调 ...

  2. SpringCloud升级之路2020.0.x版-4.maven依赖回顾以及项目框架结构

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们先来回顾下 m ...

  3. Maven依赖,去哪儿找

    1. 前言 maven是作为Javer日常开发中必不可少的工具,但是很多人对于它的使用也只是仅限于的几个功能. 前几天在使用一个依赖总是说找不到该依赖,但是在中央仓库中的确存在该构建.这个问题让我很困 ...

  4. maven 依赖原则

    maven 依赖原则 ###间接依赖路径最短优先 a->b->c1.0 a->e->f->c1.1 ====>c1.0 申明顺序优先 <!-- test1 - ...

  5. maven依赖有一个步长原则 如果a 对 b和c都有依赖 如果b的步长近则使用b的

    maven依赖有一个步长原则 如果a 对 b和c都有依赖 如果b的步长近则使用b的

  6. 急~为啥我指定的的maven依赖版本没有生效?不是最短路径原则吗?

    女朋友他们项目用了 spring-boot,以 spring-boot-parent 作为 parent: <parent> <groupId>org.springframew ...

  7. Maven(十二)Maven 依赖详解

    依赖的传递性 注意1:在Eclipise创建的Maven项目,若依赖eclipse空间中其他自己创建的 的项目时,此时并不会报错,但是当执行mvn compile命令时还是会显示缺失败.所以依赖的其他 ...

  8. maven 依赖和坐标

    1.maven 坐标由groupId.artifactId.packaging.version.classifier定义.2.classifier 用来帮助定义构建输出的一些附属构件.如,*javad ...

  9. Maven——依赖

    一.依赖的范围 依赖的范围有几个可选值,我们用得到的是:compile.test.provided 三个. [1]从项目结构角度理解 compile 和 test 的区别 [2]从开发和运行这两个不同 ...

随机推荐

  1. orecle 函数

    --创建函数语法 create [or replace] function [schema.]function_name (函数参数列表) --参数有IN.OUT.IN OUT三种类型:IN代表需要输 ...

  2. 织梦dedecms5.7二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法

    dedecms升级到5.7SP1后,开启二级域名,你会发现,在二级域名下的文章,上传的图片地址都是:二级域名+图片地址,这是相对路径.但是你的图片是默认上传在uploads里面的.应该使用绝对路径.这 ...

  3. Java解析XML的四种方法详解 - 转载

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法 在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化 ...

  4. Spark- 根据ip地址计算归属地

    主要考察的是广播变量的使用: 1.将要广播的数据 IP 规则数据存放在HDFS上,(广播出去的内容一旦广播出去产就不能改变了,如果需要实时改变的规则,可以将规则放到Redis中) 2.在Spark中转 ...

  5. js 技巧总结

    插件解析 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想和分享知识提供更专业的工具. 您可以使 ...

  6. TextView两种显示link的方法

    TextView两种显示link的方法 一.简介 也是TextView显示文本控件两种方法 也是显示丰富的文本 二.方法 TextView两种显示link的方法  1)通过TextView里面的类ht ...

  7. python学习笔记(异常处理)

    上次提到正则表达式 当未匹配到数据返回值 None 再使用 match.group 会出现异常 AttributeError 为了避免异常我改成“ match != None” 这次加入异常处理 #! ...

  8. mvvm2

    1:设计模式 在MVP模式中,为了让UI层能够从逻辑层上分离下来,设计师们在UI层与逻辑层之间加了一层interface.无论是UI开发人员还是数据开发人员,都要尊重这个契约.按照它进行设计和开发.这 ...

  9. poj2478欧拉函数

    打表欧拉函数,求2到n的欧拉函数和 #include<map> #include<set> #include<cmath> #include<queue> ...

  10. vue 时间格式化

    export function formatDate(date, fmt) { if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.g ...