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

使用google-cloud-compute v1.18.0时StopInstanceRequest报方法缺失错误

Google Compute实例启停报错:NoSuchMethodError 排查与解答

问题描述

我尝试使用com.google.cloud.compute.v1库实现程序化启停Google Compute实例,但运行时抛出错误:

...Caused by: java.lang.NoSuchMethodError: 'boolean com.google.cloud.compute.v1.StopInstanceRequest.hasDiscardLocalSsd()'...

对应的Kotlin实现代码如下:

private fun stopInstance( zone: String, instanceName: String) : Boolean{            
    val project = Helpers.getProperties("PROJECT_ID")            
    val instancesClient:InstancesClient = InstancesClient.create()            
    val stopInstanceRequest = StopInstanceRequest.newBuilder()
        .setProject(project)
        .setZone(zone)
        .setInstance(instanceName)
        .build()            
    val operation: OperationFuture<Operation, Operation> = instancesClient.stopAsync(
        stopInstanceRequest)            
    val response = operation.get(3, TimeUnit.MINUTES)            
    return if (operation.isDone && response.status == Operation.Status.DONE) {
        println("Instance stopped successfully! ${response.status}")
        true            
    } else {
        println("Instance failed to stop. ${response.status}")
        false      
    }
}

我有两个疑问:

  1. hasDiscardLocalSsd()方法是从哪里被调用的?
  2. 该方法应位于库中的哪个位置?

注:使用的是google-cloud-compute v1.18.0版本,已查阅参考文档但未解决问题。

解答

1. hasDiscardLocalSsd()的调用来源

这个方法是Google Compute客户端库内部逻辑触发的调用。当你调用InstancesClient.stopAsync()时,底层会对StopInstanceRequest对象做参数校验、Protobuf序列化等操作,过程中会自动调用hasDiscardLocalSsd()来检查请求是否设置了discardLocalSsd参数。你的代码里没有显式调用,但客户端库的内部实现依赖了这个方法。

2. 方法应处的位置

hasDiscardLocalSsd()是StopInstanceRequest类的自动生成方法,属于com.google.cloud.compute.v1.StopInstanceRequest类的成员,由Protobuf编译器根据Google Compute API的接口定义自动生成。在google-cloud-compute v1.18.0版本中,这个方法本应存在于该类中。

报错原因及修复建议

出现NoSuchMethodError的核心原因几乎都是依赖版本冲突:

  • 项目中可能同时引入了不同版本的Google Compute相关依赖(比如旧版google-api-services-compute和新版google-cloud-compute),导致运行时加载了缺少该方法的旧版StopInstanceRequest类。
  • 构建工具(Gradle/Maven)缓存了旧依赖,没有正确拉取v1.18.0版本的完整Jar包,导致类文件不完整。

修复步骤:

  • 检查项目依赖配置,排除所有与Google Compute相关的旧版依赖,确保仅保留google-cloud-compute:1.18.0。
  • 清理构建缓存,比如执行./gradlew clean(Gradle)或mvn clean(Maven),然后重新构建项目。
  • 通过IDE查看StopInstanceRequest类的来源Jar包路径,确认它来自google-cloud-compute-1.18.0.jar,而非其他旧版本的依赖包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:20:23