项目介绍
项目A需要是用maven来管理jar包,主要需要引用两个依赖
依赖1:<groupId>com.pilosa</groupId>
<artifactId>pilosa-client</artifactId>
<version>1.0.0</version>
(后面用pilosa表示)
依赖2:<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<versio>5.13.1-cdh-1.2.0</version>
(后面用hbase表示)
错误过程表述
问题1: protobuf-java 各版本不兼容
启动的时候,启动成功 ,但执行到 pilosa(依赖1)包中相关的方法时,提示关于com.google.protobuf 包的NoSuchMethodError方 法异常,通过IDE 工具查看,该类在
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>xxx</version>
</dependency>
依赖中,并且pilosa(依赖1) 和 hbase(依赖2) 都含有该依赖,但是版本不一样。看到这样的情况,我们一般会排除一个protobuf-java依赖。当排除pilosa包中的protobuf-java依赖时,发现pilosa执行相关方法 会报关于protobuf-java的错误;没办法不排除pilosa包中的依赖,排除hbase包中的protobuf-java依赖,发现pilosa执行时没问题了,但是hbase执行相关方法时 报protobuf-java的错误。
这怎么办,排除哪个都不行,查阅资料得知,可能引用的jar包相互不兼容,pilosa和hbase 所依赖的pritobuf-java不兼容。解决jar包不相互兼容问题,可以使用maven插件shade 中的relocation 功能.(详情可以baidu/google 一大堆资料),大致功能就是重定向包名,当修改了包名,两个包名不一样了,那 这两个包不就可以同时加载了,不会出现冲突了嘛(当然引用该包的import 也会跟着修改的)。 具体做法就是再创建一个子项目,项目名叫hbase-java-conflict (我打算将hbase包中的protobuf-java 重定向),具体pom文件如下:
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase