Maven依赖排查

在最近的开发过程中发现的一个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版本:

  1. 自己使用的gson2.2.4
  2. HSF依赖的gson2.2

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

原来在2.2中存在的StringMap在2.2.4中通不再存在!这。。没有办法,将版本统一使用2.2吧

猜你喜欢

转载自blog.csdn.net/WSRspirit/article/details/52195840