Spark项目Guava库NoSuchMethodError错误求助
NoSuchMethodError问题 这是典型的Guava版本冲突问题——Spark对Guava有特定的版本依赖,而你的项目大概率通过依赖传递引入了不兼容的Guava版本,或者某个第三方依赖覆盖了Spark所需的版本,最终引发java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder.refreshAfterWrite这类方法找不到的错误(注:refreshAfterWrite是Guava 16.0及以后才新增的API)。
下面是一步步的排查和解决步骤:
1. 先定位冲突的Guava版本
首先用Maven命令生成依赖树,精准找到所有引入Guava的路径:
mvn dependency:tree -Dincludes=com.google.guava:guava
执行后你会看到类似这样的输出,能清晰看到哪个依赖带了和Spark要求不一致的Guava版本:
[INFO] +- org.apache.spark:spark-core_2.12:jar:3.3.0:compile
[INFO] | - com.google.guava:guava:jar:27.0-jre:compile
[INFO] +- xxx:xxx:jar:1.0.0:compile
[INFO] | - com.google.guava:guava:jar:15.0:compile
上面的例子里,就是某个第三方依赖引入了Guava 15.0,和Spark 3.3.0需要的27.0-jre冲突了。
2. 强制统一Guava版本(推荐方案)
在你的pom.xml中添加<dependencyManagement>节点,强制指定Spark兼容的Guava版本,这样所有依赖都会使用这个统一版本:
<dependencyManagement> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <!-- 替换成你当前Spark版本对应的兼容版本: Spark 2.x通常用14.0.1/16.0.1;Spark 3.x一般用27.0-jre/30.1-jre 可以查看Spark官方文档或spark-core的依赖确认准确版本 --> <version>27.0-jre</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>
3. 排除特定依赖中的冲突Guava
如果某个第三方依赖必须使用特定版本,但它带的Guava和Spark冲突,你可以直接在该依赖中排除Guava:
<dependency> <!-- 这里是冲突的第三方依赖 --> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency>
4. 验证解决效果
重新执行mvn dependency:tree -Dincludes=com.google.guava:guava,确认所有Guava依赖都统一为你指定的版本,然后重启Spark项目,这个方法找不到的错误应该就会消失了。
内容的提问来源于stack exchange,提问作者WestCoastProjects




