如何不修改生成代码抑制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
相关产品推荐
相关产品推荐

