解决GeoMesa+HBase项目POM依赖冲突引发的NoSuchMethodError问题
DataStore.createSchema抛出的NoSuchMethodError 你遇到的这个错误确实是典型的Maven依赖版本冲突问题——具体是Guava库的版本不一致,导致Curator依赖的shaded Guava中的方法无法被找到。下面是一步步的解决办法:
1. 先定位冲突来源
首先运行Maven命令查看依赖树,找出哪些依赖引入了不同版本的Guava或Curator:
mvn dependency:tree -Dincludes=com.google.guava,org.apache.curator
这个命令会过滤出所有和Guava、Curator相关的依赖,你可以看到哪个模块引入了不兼容的版本(比如Spark、HBase可能会引入和GeoMesa不匹配的Guava)。
2. 强制统一依赖版本并排除冲突
修改你的POM文件,通过以下几个步骤修复:
第一步:在dependencyManagement中添加Curator和Shaded Guava的版本控制
在<dependencyManagement>的<dependencies>里加入以下内容,确保使用和GeoMesa 2.3.1兼容的Curator版本(2.12.0是GeoMesa 2.x默认使用的版本):
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.12.0</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.curator.shaded</groupId> <artifactId>curator-shaded-guava</artifactId> <version>2.12.0</version> </dependency>
第二步:排除其他依赖中的Guava
在你的<dependencies>里,对引入Guava的依赖(比如Spark、HBase)添加排除规则,避免它们引入的Guava覆盖Curator的shaded版本:
修改Spark依赖:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.0</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency>
修改HBase依赖:
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-common</artifactId> <version>${hbase.version}</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency>
3. 验证并重新构建
完成上述修改后,运行以下命令清理并重新构建项目:
mvn clean install
然后再测试createSchema方法,应该就能解决这个错误了。
补充说明
错误里提到的org.apache.curator.shaded.com.google.common.collect.Maps.uniqueIndex是Curator专门shaded(重命名包)的Guava方法,而如果项目中同时存在非shaded的Guava,JVM会优先加载非shaded的版本,导致找不到shaded包中的方法。通过排除其他依赖的Guava,并强制使用Curator的shaded版本,就能解决这个冲突。
内容的提问来源于stack exchange,提问作者Theofilos Ioannidis

