您的位置:首页 > 其它

Maven依赖排查

2016-08-12 22:25 141 查看
在最近的开发过程中发现的一个bug,代码如下:

private Object createBean(String serviceName,String serviceVersion) throws Exception{
HSFApiConsumerBean consumerBean = new HSFApiConsumerBean();
consumerBean.setInterfaceName(serviceName);
consumerBean.setGeneric("true");
consumerBean.setVersion(serviceVersion);
MethodSpecial ms = new MethodSpecial();
ms.setClientTimeout(2000);
ms.setMethodName("consume");
consumerBean.setMethodSpecials(new MethodSpecial[] { ms });
consumerBean.init();
return consumerBean;
}


这部分代码在单独的例子中运行成功,但是加入到我们的项目中结果爆出错误



依赖排查

一开始接触这个错误,我真的是一头雾水,为什么这都能错呢?经过一番查询基本锁定了这是由于依赖的版本出了问题,怎么查的呢,首先打开类加载的日志输出



之后我们就能够看到我们的工程具体加载的类的version了



看到了version是1.4.9,而我们的包hsf.app.spring是2.1.0.7,这样就不对了。



那我们就要查一下依赖了,网址:

http://repo.alibaba-inc.com/nexus/?spm=0.0.0.0.6xY5Z6#nexus-search;gav~com.taobao.hsf~hsf.app.spring~~~~kw,versionexpand

我们查看对应的版本,可以看到



也就是说hsp.app.spring会吧这些包打包成一个jar,而且没有指定其的version,所以我们需要在项目中手动指定版本,一查项目果然有一个1.4.9的version!所以我们实际使用的版本是1.4.9.于是我们需要在我们的项目的pom中指定version。

再来看我们的module使用的hsf version,使用的命令是mvn dependency:tree这里会看到整个项目的依赖版本,你需要关注你的module下hsf使用的version

如何解决

知道这个问题之后并不是说我们直接更改依赖的版本就ok了,因为我们的项目往往是很多层的,外层的pom一般会使用
<dependencyManagement>
控制版本,整个项目的版本不能你想改就改,有可能直接雪崩了,那我们只需要修改我们的那个子module,Maven在编译的时候遇到没有指定version的会查看父类的pom查询version,如果子类指定那么就是用子module指定version那就使用子version,这样我们只需要在我们的项目中指定version就搞定了

更麻烦的情况

在解决这个问题的同时我还遇到了多个jar依赖不同版本的gson,同样出现了
java.lang.NoClassDefFoundError: com/google/gson/internal/StringMap
这样的问题,现在一看这种问题基本就可以确定是依赖出了问题,首先查看项目中存在的gson版本:

自己使用的gson2.2.4

HSF依赖的gson2.2

显然根据
依赖仲裁
原则,这一定是使用2.2.4,那为什么高版本会出问题呢?

原来在2.2中存在的
StringMap
在2.2.4中通不再存在!这。。没有办法,将版本统一使用2.2吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息