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

如何不修改生成代码抑制Kotlin废弃方法触发的弃用编译警告

gRPC-Kotlin生成代码废弃警告处理

问题背景

项目使用grpc-kotlin生成Kotlin语言风格的gRPC服务对接接口时,生成代码会出现多处废弃方法调用相关的编译警告,警告示例:

> Task :lib:compileKotlin
w: /Users/pedro/.../java/lib/src/main/kotlin/.../v1/GetUserByIdResponseKt.kt: (30, 24): 'getName(): String!' is deprecated. Deprecated in Java

警告触发逻辑:

  • Protobuf服务定义中标记为deprecated = true的字段、RPC,会被protoc生成带@java.lang.Deprecated注解的Java方法
  • grpc-kotlin基于上述Java代码生成对应Kotlin包装方法,这些Kotlin方法本身已经标注@kotlin.Deprecated注解,但方法内部调用Java层废弃方法的逻辑,依然会触发Kotlin编译器的废弃警告

对应代码示例:
Protobuf定义:

message GetUserByIdResponse {
  string name = 1 [deprecated = true];
  ...
}

protoc生成的Java代码:

/**
   * <code>string name = 1 [deprecated = true];</code>
   * @deprecated
   * @return The name.
   */
  @java.lang.Override
  @java.lang.Deprecated public java.lang.String getName() {
    java.lang.Object ref = name_;
    if (ref instanceof java.lang.String) {
      return (java.lang.String) ref;
    } else {
      com.google.protobuf.ByteString bs = 
          (com.google.protobuf.ByteString) ref;
      java.lang.String s = bs.toStringUtf8();
      name_ = s;
      return s;
    }
  }

grpc-kotlin生成的Kotlin代码:

/**
     * <code>string name = 1 [deprecated = true];</code>
     */
    @kotlin.Deprecated(message = "Field name is deprecated") public var name: kotlin.String
      @JvmName("getName")
      get() = _builder.getName()
      @JvmName("setName")
      set(value) {
        _builder.setName(value)
      }

手动为生成代码添加@kotlin.Suppress("DEPRECATION")可以消除警告,但需要修改自动生成的代码或给grpc-kotlin打补丁,维护成本过高。

可行解决方案

方案1:定向屏蔽生成代码路径的警告

通过构建配置单独为自动生成的代码目录添加编译参数,抑制该路径下的废弃警告,无需修改生成代码。
该方案不会屏蔽手写业务代码中的废弃调用警告,适合需要保留业务代码告警校验能力的场景。

  • Gradle配置示例:
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    val generatedCodeDir = "${layout.buildDirectory.get().asFile.absolutePath}/generated"
    doFirst {
        if (file(generatedCodeDir).exists()) {
            sourceDirectories
                .filter { it.absolutePath.startsWith(generatedCodeDir) }
                .forEach {
                    kotlinOptions.freeCompilerArgs += "-Xsuppress-warnings=DEPRECATION"
                }
        }
    }
}
  • Maven配置:在kotlin-maven-plugin中新增独立execution,将生成代码目录作为单独源集编译,编译时追加-Xsuppress-warnings=DEPRECATION参数即可。

方案2:全局编译器参数抑制

直接配置Kotlin编译器全局参数,统一屏蔽所有DEPRECATION类警告。
该方案会屏蔽全项目所有废弃调用警告,包括手写业务代码中的相关提示,仅适合不需要做废弃接口校验的项目使用。

  • 命令行编译追加参数:-Xsuppress-warnings=DEPRECATION
  • Gradle配置:在所有Kotlin编译任务的kotlinOptions.freeCompilerArgs中追加上述参数
  • Maven配置:在kotlin-maven-plugin的compilerArgs节点下添加上述参数

方案3:升级依赖从源头修复

新版grpc-kotlin代码生成器已经修复了该问题:生成标记为废弃的Kotlin包装方法时,会自动在调用Java废弃方法的getter/setter上添加@Suppress("DEPRECATION")注解,从代码生成源头避免警告触发。如果项目依赖升级没有兼容性阻塞,直接升级grpc-kotlin到最新稳定版是长期维护成本最低的方案。


内容的提问来源于stack exchange,提问作者Pedro Tôrres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:03:17