调用Google Cloud Storage列取文件接口出现NoSuchMethodError求助
问题排查结果
错误根因
你遇到的NoSuchMethodError是典型的Guava依赖版本冲突问题:
你显式引入的com.google.guava:guava:31.0.1-jre和com.google.cloud:google-cloud-storage:1.113.14-sp.2依赖的底层gax库要求的Guava版本不匹配。该版本google-cloud-storage调用的MoreExecutors.directExecutor()方法在低版本Guava中返回值为ListeningExecutorService,而Guava 31中该方法返回值修改为Executor,方法签名不匹配触发类加载错误。
修复方案
- 优先移除项目中显式声明的Guava 31.0.1-jre依赖,让Maven/Gradle等构建工具自动拉取google-cloud-storage传递依赖的匹配版本Guava即可解决报错。
- 如果项目其他组件必须依赖高版本Guava,可将
google-cloud-storage升级到2.x及以上版本,新版本已完成高版本Guava的适配。
代码逻辑补充说明
你当前代码中存在两处可优化点:
- 你将
Storage.BlobListOption.prefix(keyName)查询参数注释了,所以当前调用只会返回整个存储桶的全部文件,不会按照传入的keyName前缀过滤,如需前缀查询取消该注释即可。 - 代码中直接对Blob列表调用
.tail,如果存储桶为空或者前缀匹配结果为空,会抛出NoSuchElementException,建议增加列表非空判断后再调用tail。
内容的提问来源于stack exchange,提问作者Srinivas
相关产品推荐
相关产品推荐

