如何抑制特定的 Kotlinc/Javac 编译器警告?

2022-09-01 02:11:50

如何抑制在类似?deprecationsKotlinCompileGradleJavaCompile

JavaCompile(works):

tasks.withType(JavaCompile) {
    configure(options) {
        compilerArgs << '-Xlint:-deprecation'
    }
}

KotlinCompile(不工作):

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
    kotlinOptions {
        freeCompilerArgs = ["-Xjavac-arguments=-Xlint:-deprecation"]
    }
}

引用:

类似问题:


答案 1

目前,Kotlin 不支持 Surpressing 编译器警告。他们确实有一些类别可以超越。但不同的是,唯一的办法是:

@Suppress("DEPRECATION")

有时Surpress不会通过输入应该在运行时工作的注释来工作。您可能需要添加类似以下内容的内容

val foo = error.asDynamic().response
if (foo is AxiosResponse<String>) {
    @Suppress("UNCHECKED_CAST")
    val response = foo as AxiosResponse<String>
}

这不是你的情况。但显然其他人也有类似的问题。我建议简要看看reddit。这也不是上面的情况,但可以引导你。

https://www.reddit.com/r/Kotlin/comments/bsgk5w/what_do_i_have_to_do_to_suppress_my_unchecked/


答案 2

如果你的目标是禁止弃用,这样你就可以让构建在彼此的Kotlin警告上失败,那么这就是我的经验。

有一种方法可以配置 Kotlin 编译器,使其在每次警告时都失败。只需将以下配置添加到您的文件中:build.gradle

// For Android Project
android {
    kotlinOptions {
        allWarningsAsErrors = true
    }
}
// For non Android Project
compileKotlin {
    kotlinOptions {
        allWarningsAsErrors = true
    }
}

但是在启用该标志后,Kotlin 编译器在每次弃用的代码用法后都将失败。不幸的是,Kotlin 不支持忽略那些已弃用的警告或避免失败。allWarningsAsErrors

以下 Gradle 脚本提供了此问题的解决方案。

import org.gradle.api.Project
import org.gradle.api.internal.GradleInternal
import org.gradle.configurationcache.extensions.serviceOf
import org.gradle.internal.logging.events.operations.LogEventBuildOperationProgressDetails
import org.gradle.internal.operations.BuildOperationDescriptor
import org.gradle.internal.operations.BuildOperationListener
import org.gradle.internal.operations.BuildOperationListenerManager
import org.gradle.internal.operations.OperationFinishEvent
import org.gradle.internal.operations.OperationIdentifier
import org.gradle.internal.operations.OperationProgressEvent
import org.gradle.internal.operations.OperationStartEvent

val kotlinWarnings = mutableListOf<String>()
val buildOperationListener = object : BuildOperationListener {
    override fun started(buildOperation: BuildOperationDescriptor, startEvent: OperationStartEvent) {
    }

    override fun progress(operationIdentifier: OperationIdentifier, progressEvent: OperationProgressEvent) {
        val log = progressEvent.details
        if (log is LogEventBuildOperationProgressDetails) {
            if (log.message.contains("w:") && !log.message.contains("is deprecated.") && !kotlinWarnings.contains(log.message)) {
                kotlinWarnings.add(log.message)
            }
        }
    }

    override fun finished(buildOperation: BuildOperationDescriptor, finishEvent: OperationFinishEvent) {
    }
}
val gradleInternal = project.gradle as GradleInternal
val buildOperationListenerManager = gradleInternal.serviceOf() as BuildOperationListenerManager?
buildOperationListenerManager?.addListener(buildOperationListener)
project.gradle.buildFinished {
    buildOperationListenerManager?.removeListener(buildOperationListener)
    if (kotlinWarnings.isNotEmpty()) {
        kotlinWarnings.forEach { project.logger.warn(it) }
        throw RuntimeException("Kotlin warning found")
    }
}

基本上,a 被添加到 Gradle 版本中,因此您可以侦听每个控制台日志。检查每个日志以搜索 Kotlin 警告,但忽略已弃用的使用警告。最后,如果项目上有 Kotlin 警告,则会引发异常BuildOperationListener


以下文章提供了有关此主题的详细信息:在 Kotlin 上构建失败警告


推荐