最近有用户反馈,他的项目中同时使用了HBase和一个RPC框架,HBase依赖2.5.0的protobuf,RPC框架依赖3.7的protobuf,导致他的项目编译都失败。0.98版本的HBase还是使用的原生的protobuf-java依赖,2.0版本才使用了shaded形式的protobuf,所以我们决定自己提供以shaded形式引入protobuf的HBase Client。
相信这个问题不只是出现在HBase中,或者出现在与protobuf相关的项目中,其实当我们项目间接依赖了像protobuf、netty等大版本之间互不兼容的框架,甚至guava这种某些接口不兼容的框架,都有可能出现类似的问题。这里也是提供一个可以参考的解决方法。
方法上,参考了HBase 2.0之后对第三方依赖的处理,简单来说就是将常用第三方依赖的代码负责一份,修改所有类的package,发布一个自己的artifact到仓库中。这样肯定就不会再依赖冲突了。
而protobuf的依赖处理起来则比较麻烦一点,除了修改原生protobuf类的package之外,还需要处理proto生成的Java文件。所以本文就以protobuf为例,提供第三方依赖冲突的解决方案。因为都是使用Maven插件实现,所以也只对Maven项目有用,相信其他项目也有类似的解决办法。
本文相关代码都已放在Github