Maven依赖排查
2016-08-12 22:25
141 查看
在最近的开发过程中发现的一个bug,代码如下:
这部分代码在单独的例子中运行成功,但是加入到我们的项目中结果爆出错误
之后我们就能够看到我们的工程具体加载的类的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
自己使用的gson2.2.4
HSF依赖的gson2.2
显然根据
原来在2.2中存在的
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吧
相关文章推荐
- 如何排查 Maven 依赖冲突的问题
- maven依赖错误排查经验
- Maven打包Spring boot,把依赖和配置文件及前端代码提取到jar文件外
- Maven的传递性依赖及其jar包冲突解决
- idea导入maven项目 无法加载依赖包
- Maven 将依赖打进一个jar包
- maven去掉重复依赖的jar包
- Eclipse添加maven依赖找不到maven库中的jar
- 使用Maven Assembly plugin将依赖打包进jar
- 【Maven】maven的依赖
- Maven 包依赖
- maven 坐标和依赖
- maven添加远程仓库以及导出依赖的jar包以及常用操作收集
- 解决Maven项目相互依赖/循环依赖/双向依赖的问题
- maven将依赖包打进一个jar包
- maven依赖关系中Scope的作用
- Maven之(九)依赖关系
- Maven解决类包依赖冲突
- Maven添加servlet、jsp依赖
- maven的依赖版本范围