Java使用JSON密钥访问GCS抛出StorageException异常如何解决?
问题根因
该错误是Guava版本冲突导致的,核心报错点java.lang.NoSuchMethodError: com.google.common.io.ByteStreams.exhaust(Ljava/io/InputStream;)J说明运行时加载的Guava版本过旧,不存在目标方法。
出现IDEA运行异常、打包后Jar正常的差异,是因为IntelliJ的类加载优先级和Maven打包后的类加载优先级不一致:IDEA默认按依赖声明顺序加载类,你项目里引入的老旧依赖先加载,覆盖了高版本Guava的同名类,而Maven打包时会自动按依赖最短路径、声明顺序仲裁,最终用了正确版本的Guava。
具体冲突来源
- 你依赖的
com.google.collections:google-collections:1.0是2008年就停止维护的废弃库,所有功能早已合并进Guava,这个库中的旧版ByteStreams类没有exhaust方法。 - 额外引入的
com.google.cloud:google-cloud:0.8.0是早已废弃的版本,也会传递引入大量和当前libraries-bom不兼容的旧版依赖。
解决方案
按以下步骤修改即可:
- 删除废弃依赖,从pom.xml中移除以下两个依赖声明:
<!-- 移除这个废弃的google-collections --> <dependency> <groupId>com.google.collections</groupId> <artifactId>google-collections</artifactId> <version>1.0</version> </dependency> <!-- 移除这个老旧的google-cloud依赖 --> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud</artifactId> <version>0.8.0</version> </dependency>
- 统一Guava版本管理,你已经引入了Google官方的libraries-bom来做依赖版本统一,不需要手动指定Guava版本,把Guava依赖的版本声明去掉即可,避免手动指定版本和GCS SDK要求的版本不兼容:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <!-- 去掉这里的version标签,由libraries-bom统一管理兼容版本 --> </dependency>
- 刷新IntelliJ依赖与缓存:
- 点击IDEA右侧Maven面板的刷新按钮,或者右键项目选择「Maven -> Reload Project」重新加载依赖
- 清理IDEA缓存:选择顶部菜单「File -> Invalidate Caches...」,勾选清除文件系统缓存和本地历史,重启IDEA后再次运行测试即可。
修改完成后IDEA运行和打包后的Jar都会正常工作,不会影响原有功能。
内容的提问来源于stack exchange,提问作者Vik H
相关产品推荐
相关产品推荐

