【问题标题】:How to suppress specific Kotlinc/Javac compiler warnings?如何抑制特定的 Kotlinc/Javac 编译器警告?
【发布时间】:2018-09-25 00:17:53
【问题描述】:

如何在Gradle 中抑制deprecations 中的KotlinCompile 类似于JavaCompile

JavaCompile(工作):

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

KotlinCompile(不起作用):

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

参考资料:

类似问题:

【问题讨论】:

标签: java gradle kotlin


【解决方案1】:

目前 Kotlin 不支持抑制编译器警告。他们确实有一些类别需要压制。但不同的是,唯一的方法是:

@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
        }
    }
    

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

    以下 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")
        }
    }
    

    基本上,BuildOperationListener 会添加到 Gradle 构建中,因此您可以侦听每个控制台日志。检查每个日志以搜索 Kotlin 警告,但忽略不推荐使用的警告。最后,如果项目中有 Kotlin 警告,则会抛出异常


    以下文章提供了有关此主题的更多信息:Fail your build on Kotlin warnings

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 2010-11-04
      • 2011-03-26
      • 1970-01-01
      相关资源
      最近更新 更多