Phoenix-Spark-5.0.0-HBase-2.0与Scala 2.12兼容性问题求助
问题根因
该问题属于Scala版本二进制不兼容问题:
- Phoenix Spark 5.0.0-HBase-2.0官方默认基于Scala 2.11编译,报错涉及的
scala.Predef$.refArrayOps方法签名在Scala 2.11和2.12中存在差异 - Scala 2.12中该方法的返回值类型发生了变更,导致运行时找不到对应签名的方法,抛出
NoSuchMethodError
可行解决方案
方案1:降级运行环境的Scala版本到2.11.x
如果业务没有强依赖Scala 2.12的特性,可直接将Spark集群/本地运行环境的Scala版本切换为2.11系列,和官方发布的Phoenix Spark依赖的Scala版本对齐即可解决问题。
方案2:自行基于Scala 2.12编译Phoenix Spark 5.0.0版本
如果必须使用Scala 2.12环境,可以拉取Phoenix官方对应版本的源码,修改编译配置指定Scala 2.12版本后重新打包:
- 拉取Phoenix 5.0.0-HBase-2.0对应的官方源码包
- 修改源码根目录下的pom.xml文件,将
scala.version属性值调整为你使用的2.12.x版本,同时调整所有Scala相关依赖的artifactId后缀为_2.12 - 执行
mvn clean package -DskipTests命令编译phoenix-spark模块 - 使用自行编译的
phoenix-spark-5.0.0-HBase-2.0_2.12.jar替换原有依赖即可
方案3:使用依赖重定位(Shade)机制修复冲突
如果不方便修改环境和重新编译,可以在你的项目构建配置中添加shade插件,对Phoenix Spark依赖的Scala 2.11类进行重定位:
- Maven项目可使用
maven-shade-plugin,Gradle项目可使用shadow插件 - 配置规则将
scala.Predef相关的引用重定向到你本地Scala 2.12的对应类即可
内容的提问来源于stack exchange,提问作者Faouzi Chabchoub
相关产品推荐
相关产品推荐

