You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从GCP存储桶读取文件时遭遇NoSuchMethodError问题求助

问题原因分析

这个NoSuchMethodError我之前也碰到过,本质是Google Cloud Storage(GCS)客户端库与它依赖的google-api-services-storage版本不兼容导致的:

  • 你使用的google-cloud-storage库(通过HttpStorageRpc类)尝试调用com.google.api.services.storage.Storage$Objects$Get.setReturnRawInputStream(Z)方法,但这个方法在你项目中当前引入的google-api-services-storage版本里并不存在。
  • 通常是因为项目中同时引入了不同版本的GCS相关依赖,或者手动指定了google-api-services-storage的版本,和google-cloud-storage要求的版本不匹配。
解决方法

1. 使用Google Cloud BOM统一管理依赖版本

最稳妥的方式是引入Google Cloud的Bill of Materials(BOM),它会自动确保所有Google Cloud相关依赖的版本都是兼容的,彻底避免版本冲突。

Maven配置示例:

在你的pom.xml中添加BOM到dependencyManagement,然后只声明google-cloud-storage依赖即可,无需指定版本:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>libraries-bom</artifactId>
      <version>26.34.0</version> <!-- 建议使用最新稳定版,可在Google Cloud官网查询 -->
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-storage</artifactId>
  </dependency>
</dependencies>

Gradle配置示例:

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencyManagement {
    imports {
        mavenBom 'com.google.cloud:libraries-bom:26.34.0'
    }
}

dependencies {
    implementation 'com.google.cloud:google-cloud-storage'
}

2. 排查并排除冲突的依赖

如果已经使用了BOM还是有问题,或者无法使用BOM,可以检查项目中是否有其他依赖引入了旧版本的google-api-services-storage:

  • Maven:执行以下命令查看依赖树,找出冲突的版本:
    mvn dependency:tree | grep google-api-services-storage
    
  • Gradle:执行以下命令查看依赖树:
    ./gradlew dependencies | grep google-api-services-storage
    

找到引入旧版本的依赖后,在该依赖中排除google-api-services-storage:

<!-- Maven排除示例 -->
<dependency>
  <groupId>第三方依赖的groupId</groupId>
  <artifactId>第三方依赖的artifactId</artifactId>
  <exclusions>
    <exclusion>
      <groupId>com.google.apis</groupId>
      <artifactId>google-api-services-storage</artifactId>
    </exclusion>
  </exclusions>
</dependency>

3. 清理依赖缓存

修改依赖后,记得清理本地依赖缓存,避免旧版本依赖残留:

  • Maven:mvn clean install -U
  • Gradle:./gradlew clean build --refresh-dependencies
额外小建议

你的printBlob方法中捕获了Exception但没有任何处理,建议至少添加日志输出,方便后续排查问题:

private void printBlob(ReadChannel reader) { 
    try { 
        WritableByteChannel outChannel = Channels.newChannel(System.out); 
        ByteBuffer bytes = ByteBuffer.allocate(64 * 1024); 
        while (reader.read(bytes) > 0) { 
            bytes.flip(); 
            outChannel.write(bytes); 
            bytes.clear(); 
        } 
    } catch (Exception e) { 
        // 添加日志输出
        e.printStackTrace();
        // 或者使用日志框架记录
        // logger.error("Failed to read blob content", e);
    } 
}

内容的提问来源于stack exchange,提问作者althor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:01:46