问题背景

再数据平台中,项目搭建需要使用es和HBASE搭建数据查询接口,整合的过程中出现jar包冲突的bug :com.google.common.base.Stopwatch.()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator

org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocatorat org.apache.hadoop.hbase.client.RpcRetryingCaller.translateException(RpcRetryingCaller.java:239)at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:150)...at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocatorat org.apache.hadoop.hbase.zookeeper.MetaTableLocator.blockUntil...at org.apache.hadoop.hbase.client.RegionServerCallable.prepare(RegionServerCallable.java:75)at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:134)... 45 more

解决办法

经排查,确认是因为 com.google.guava 这个包引起的冲突。es依赖于18及以上版本,而HBASE只支持16及以上版本。而guava这个包从17开始内部发生变化,方法发生改变,所以18并不会向下兼容16版本。在项目运行的过程中,如果同时引入16、18版本,es及hbase的调用过程会发生混乱。那么接下来就好办了,我们可以重新打包,将guava18打入es内部,再在pom文件中显示引用guava16版本的包。这样,es调用包内部打入的guava18,而hbase调用外部的guava16。

重新打包

新建maven工程,在pom文件中进行如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--this maven project is aim to fix the jar comflic in hbase & elasticsearch.in es, required guava 18+ or up. but in hbase you should use guava 16- or blow.cd the project directory and run 'sh ./cleanbuild.sh',you will get a new-self jar.then, adjust your project pom.xml whth:<dependency><groupId>douguo.shaded.elasticsearch</groupId><artifactId>douguo_shaded_elasticsearch</artifactId><version>1.0-SNAPSHOT</version><exclusions><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions></dependency>finally, your jar comflic will be fixed.@date:2017-11-30@author:zhangjianfei@since:douguo.shaded.elasticsearch-1.0.0--><groupId>douguo.shaded.elasticsearch</groupId><artifactId>douguo_shaded_elasticsearch</artifactId><version>1.0-SNAPSHOT</version><properties><elasticsearch.version>2.4.1</elasticsearch.version></properties><dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.plugin</groupId><artifactId>shield</artifactId><version>${elasticsearch.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.4.1</version><configuration><createDependencyReducedPom>false</createDependencyReducedPom></configuration><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><relocations><relocation><pattern>com.google.guava</pattern><shadedPattern>douguo.shaded.elasticsearch.guava</shadedPattern></relocation><relocation><pattern>org.joda</pattern><shadedPattern>douguo.shaded.elasticsearch.joda</shadedPattern></relocation><relocation><pattern>com.google.common</pattern><shadedPattern>douguo.shaded.elasticsearch.common</shadedPattern></relocation><relocation><pattern>com.google.thirdparty</pattern><shadedPattern>douguo.shaded.elasticsearch.thirdparty</shadedPattern></relocation></relocations><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" /></transformers></configuration></execution></executions></plugin></plugins></build><repositories><repository><id>elasticsearch-releases</id><url>http://maven.elasticsearch.org/releases</url><releases><enabled>true</enabled><updatePolicy>daily</updatePolicy></releases><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>

将org.joda等4个可能有冲突的jar包通过maven-shade-plugin插件迁移后重新打个jar包从而使得在引入这个jar包时能够使用该jar包自己的依赖而不是使用外部依赖。这里需要注意的是,需要将com.google.common等4个包全部重新迁移,否则会出现java.lang.IllegalAccessError: tried to access method com.google.common.base的错误

项目打包

mvn clean install

新的依赖包会在.m2 maven仓库中,如果公司搭建了仓库的话,需要上传jar包。如果直接运行jar包的话,记得重新编译项目,并替换lib目录

项目载入新包

只需要在pom文件中配置:

<!-- douguo.shaded.elasticsearch -->
<dependency><groupId>douguo.shaded.elasticsearch</groupId><artifactId>douguo_shaded_elasticsearch</artifactId><version>1.0-SNAPSHOT</version><exclusions><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions>
</dependency><!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<!-- this guava is only used in habsein es, 18.0+ is required, but hbase only supported 16.0 or blow.clean as install douguo.shaded.elasticsearch -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>16.0</version>
</dependency>

这样,guava18包就在douguo.shaded.elasticsearch下,es会优先调用。而外部配置的guava16就会被HBASE调用。2个版本的jar包互相独立存在!

到此,问题就解决了!


参考文章:

  • http://blog.csdn.net/sunshine920103/article/details/51659936
  • https://www.elastic.co/blog/to-shade-or-not-to-shade

Hbase、elasticsearch整合中jar包冲突相关推荐

  1. Maven中 jar包冲突原理与解决办法依赖传递

    Maven中 jar包冲突原理与解决办法&依赖传递 管理包依赖是 Maven 核心功能之一,下面通过如何引入 jar 包:如何解析 jar 包依赖:包冲突是如何产生:如何解决包冲突:依赖管理解 ...

  2. idea中jar包冲突classNotFound

    在springboot项目开发的时候,遇到过log4j2和logback的jar冲突,很多springboot整合的jar包中有这一块的jar.比如: <dependency> <g ...

  3. 阿里云SDK和SpringBoot maven项目中jar包冲突的解决办法

    stringboot项目在引用阿里云短信sdk时,出现jar包冲突问题,项目可以正常启动,但是启动会报如图错误 解决办法,在maven中查找到冲突的jar,并用exclusions隔离冲突的jar & ...

  4. Maven中jar包冲突的解决方式

    现象 创建一个maven工程,引入spring-context包. <dependency><groupId>org.springframework</groupId&g ...

  5. Maven中 jar包冲突的解决办法

    问题描述:启动工程报如下错误: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:fil ...

  6. Maven Jar包冲突?看看高手是怎么解决的

    接手了一套比较有年代感的系统,计划把重构及遇到的问题写成系列文章,老树发新枝,重温一些实战技术,分享给大家.[重构02篇]:Maven项目Jar包管理机制.冲突解决. 知识背景 Jar包冲突在软件开发 ...

  7. Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突)

    Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) 参考文章: (1)Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) (2)ht ...

  8. 关于两个jar包中存在包名和类名都完全相同的jar包冲突问题

    2019独角兽企业重金招聘Python工程师标准>>> 最近弄webservice,我使用的jdk自带的wsimport工具来生成客户端代码,发现生成的代码具有编译错误,错误描述如下 ...

  9. Jar包冲突解决方法 Unknown lifecycle phase mvn Eclipse中执行maven命令

    1.如下图,右击需要执行maven命令的工程,选择"Debug As"或"Run As",再选择"Maven build..." 进行如上操 ...

  10. 在IDEA中解决jar包冲突的神操作-必看,秒杀市面方法

    在开发过程中,经常会遇到导入jar包后jar包冲突的情况,大家也都知道,解决jar包冲突通常都比较麻烦,要找到多余的依赖,把低版本的依赖去掉.而大家通常能搜到IDEA解决jar包冲突的方法,应该是这样 ...

最新文章

  1. NAS存储对称和非对称结构之前的区别概述
  2. 深度学习最近发现详细分析报告
  3. 大家对协同管理软件是怎么理解的?协同管理软件最主要需要解决企业/组织什么问题?
  4. http默认超时时间_Bof 是一个HTTP客户端,旨在尽可能方便用户使用
  5. 如何把jar包发布到maven私服
  6. gdal数据类型_科学网-gdal数据类型的代码的核心定义文件-林清莹的博文
  7. IDEA版本控制工具VCS中使用Git,以及快捷键总结(不使用命令)
  8. layui 读取本地excel内容_Python操作Excel基础(1)
  9. hashMap的快速存取
  10. 博弈论 斯坦福game theory stanford week 2.1_
  11. overflow 属性
  12. R语言入门mac——RStudio安装➕R包安装【附安装链接】
  13. MIB 浏览器的使用指导
  14. dbcp 出现的connection is closed的问题
  15. Archiving 时遇到的错误
  16. 【数据分析】2022 年将占据主导地位的 3 种数据和分析趋势
  17. 基于二哈实现多人人脸学习和识别
  18. 前端学习-品优购实践
  19. JPEG压缩算法详解(转载)
  20. GraphicConverter Mac图片浏览和编辑器

热门文章

  1. 用简单英语谈生意-介绍篇
  2. 字节跳动基于ClickHouse优化实践之“高可用”
  3. ZYNQ BRAM_ctrl PS PL通信报错
  4. WebRTC-NACK、Pacer和拥塞控制和FEC
  5. 计算机专业社会调研怎么写,计算机专业调研论文提纲格式 计算机专业调研论文提纲怎么写...
  6. 系统指定的路径不存在,怎么办
  7. 20201002Class not found XXXXTest
  8. wince驱动加载失败
  9. 单片机加减法C语言,如何利用51单片机实现加减法计算
  10. Android之按钮点击事件(单击、双击、长按等)