如何在IntelliJ中设置“-Xuse-experimental=kotlin.experimental”

35

在IntelliJ中尝试构建Kotlin/Ktor应用程序时,出现了多个形式如下的警告:

Warning:(276, 6) Kotlin: This class can only be used with the compiler argument '-Xuse-experimental=kotlin.Experimental'

输出结果。警告是指

@UseExperimental(KtorExperimentalLocationsAPI::class)

我原以为通过设置设置 -> 构建 -> 编译器 -> Kotlin编译器 -> 附加命令行参数-version -Xuse-experimental=kotlin.Experimental就能满足警告。(-version已经存在)。但是警告仍然出现。我该如何满足它呢?谢谢。


你应该遵循这个提示,尝试使用@UnstableDefault。 - BollMose
7个回答

29

你的项目使用Maven还是Gradle?我在使用Gradle时也遇到了同样的问题,但通过将-Xuse-experimental=kotlin.Experimental放入我的build.gradle文件中的tasks.withType中,我成功消除了警告。

对于KtorExperimentalLocationsAPI,你可以尝试:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions.freeCompilerArgs += ["-Xuse-experimental=io.ktor.locations.KtorExperimentalLocationsAPI"]
}

1
如果我们使用了许多实验性功能,比如UnstableDefaultImplicitSerialization,该怎么办呢?那么参数会是这样吗?kotlinOptions.freeCompilerArgs += ["-Xuse-experimental=io.ktor.locations.KtorExperimentalLocationsAPI, UnstableDefault, Implicit, etc"] - mochadwi
1
更新了我的上面的评论:当使用多个参数时,您可以这样做:kotlinOptions.freeCompilerArgs += [ "-Xuse-experimental=io.ktor.locations.KtorExperimentalLocationsAPI", "-Xuse-experimental=kotlinx.serialization.UnstableDefault", "-Xuse-experimental=kotlinx.serialization.ImplicitSerialization"] - mochadwi

24

在当前 Kotlin 版本(1.5)中,您可以通过添加 @OptIn 注释来使用任何实验性库。

@OptIn(ExperimentalCoroutinesApi::class)

然而,选择加入机制本身是实验性的,如果想要使用它,您需要添加编译器参数。在 Kotlin Multiplatform 中,最符合语言习惯的方式是:

kotlin.sourceSets.all {
    languageSettings.useExperimentalAnnotation("kotlin.RequiresOptIn")
}

16
languageSettings.useExperimentalAnnotation() has recently been replaced by languageSettings.optIn() - Joffrey

7
build.gradle.kts 文件中。
主要涉及到多平台项目。
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    kotlinOptions{
        kotlin.sourceSets.all {
            languageSettings.optIn("kotlin.RequiresOptIn")
        }
    }
}

单一平台

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    kotlinOptions {
        // ...
        freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
    }
}

1
这个只在2022年4月29日之后的最新版本中有效。 - Dživo Jelić

4

前往你的app/build.gradle文件,在底部添加以下任务:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
    kotlinOptions {
        freeCompilerArgs += "-Xopt-in=io.ktor.util.KtorExperimentalAPI"
    }
}

4
编辑Graddle 6.5.1和Ktor 1.3.2版。
@jay-janez的回答看起来是这样的:
tasks.withType(KotlinCompile::class).all {
    kotlinOptions.freeCompilerArgs += "-Xuse-experimental=io.ktor.util.KtorExperimentalAPI"
}

3

虽然这是一个老问题,但是现在有一些变化。

-Xuse-experimental 已经被 -Xopt-in 替代了。可以查看文档获取更多信息。

对于Grade Kotlin DSL,您还可以使用以下语法:

tasks.withType<KotlinCompile> {
    kotlinOptions.freeCompilerArgs = listOf(
        "-Xopt-in=io.ktor.util.KtorExperimentalAPI"
    )
}

获取Could not get unknown property 'withType' for task set of type。我猜我添加这个的地方有误或是新版Gradle已经有所改变。 - acarlstein

1
您可以在构建中添加-opt-in=kotlin.RequiresOptIn编译器参数。
  kotlinOptions {
        freeCompilerArgs += [
                "-Xopt-in=kotlin.RequiresOptIn"
        ]
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接