1. 背景
我们在使用maven经常会遇到各种版本的问题,比如
- 多个依赖中包含了同一个资源依赖,但他们版本不一样,一下也不清楚实际依赖的哪个版本
- 因为依赖的版本不对的原因,我们的项目没有成功启动,有时可能直接还看不出是哪个依赖有问题
-
即使项目启动成功,程序跑着跑着,突然报了一个错,比如像下面这个:
一个突然的异常.png
可能突然看到这个,你可能都有点蒙,是正常的,谁能一下子能看了出来,稍加研究一下,你大概找到了下面这个jar包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
找到了,还不一定有用,是不是这个版本在生效,是高了,还是低了呢?
2. 一般排查过程
1)我们可以使用maven一般依赖的知识,有两个基本依赖的原则:
- 路径深浅原则,越短的越优先
- 同一路径的,顺序在前的有效
2)其实呢,我们不需要研究这么细,一般的IDE都有直接查看的方法,拿在eclipse中举例:

这时,我们可以在打开的页面中,有左右两个布局,
左边是所有包的依赖树,右边是最后生效的依赖包,包括版本号,右上角有一个搜索框,
这时我们可以搜索刚才的依赖,这里我们输入slf4j,找到相应的依赖后,单击后,左树就显示出了这个依赖所有相关的依赖目录树
这里有时就是不同版本的包,有冲突了,不是期望的版本生效了,这时一般排除一下不用的版本就可以了。
3)查找具体的类查看
有时少数,上面的排除还是不能解决问题,这个我们需要查看具体的类内容

这时,我们从左边生效的jar包中找到相应的类,有时可能找不到这个类,当然这个例子中,类是有的,只是版本的问题,这个版本中
没有这个方法,这样,我们心里大概有了数,就是当前这个版本不对,可能是低了,也可能是高了,当然大多数情况下,是低了,一般
情况下,都会做向下兼容,后来呢,我们找到了高一点版本的依赖,最后就使用通过了(可用的版本是1.7.30),
package org.slf4j.helpers;
/**
* An internal utility class.
*
* @author Alexander Dorokhine
* @author Ceki Gülcü
*/
public final class Util {
private Util() {
}
public static String safeGetSystemProperty(String key) {
if (key == null)
throw new IllegalArgumentException("null input");
String result = null;
try {
result = System.getProperty(key);
} catch (java.lang.SecurityException sm) {
; // ignore
}
return result;
}
public static boolean safeGetBooleanSystemProperty(String key) {
String value = safeGetSystemProperty(key);
if (value == null)
return false;
else
return value.equalsIgnoreCase("true");
}
稍占点篇幅,贴一下神秘出现的方法代码safeGetBooleanSystemProperty,很棒!
你也感觉很棒吧,来点个赞吧!-_-
网友评论