如何修复IntelliJ IDEA中冲突的Kotlin依赖?

时间:2018-05-11 14:00:09

标签: gradle kotlin dependencies

我们正在Kotlin中创建一个多平台项目,某个模块的一部分使用实验coroutines功能。

我们一起使用Gradle来构建项目/库。通用模块的gradle构建脚本如下所示:

apply plugin: 'kotlin-platform-common'

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5"
    testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version"
    testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version"
}
kotlin {
    experimental {
        coroutines "enable"
    }
}
这里真的没什么特别的。然而,协同所依赖的Kotlin标准库的冲突版本和我们想要在项目中使用的Kotlin标准库似乎存在问题。

除了其他信息,gradle module:dependencies输出一个包含此信息的树:

compileClasspath - Compile classpath for source set 'main'.
+--- org.jetbrains.kotlin:kotlin-stdlib-common:1.2.41
\--- org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5
     \--- org.jetbrains.kotlin:kotlin-stdlib:1.2.21
          \--- org.jetbrains:annotations:13.0

compileOnly - Compile only dependencies for source set 'main'.
No dependencies

default - Configuration for default artifacts.
+--- org.jetbrains.kotlin:kotlin-stdlib-common:1.2.41
\--- org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5
     \--- org.jetbrains.kotlin:kotlin-stdlib:1.2.21
          \--- org.jetbrains:annotations:13.0

implementation - Implementation only dependencies for source set 'main'. (n)
+--- org.jetbrains.kotlin:kotlin-stdlib-common:1.2.41 (n)
\--- org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5 (n)

如您所见,该项目依赖于Kotlin的1.2.41版本,但协同程序库内部依赖于1.2.21。

这导致的问题是,当我使用Kotlin语言中的某些构造时,IntelliJ无法识别它并显示 Unresolved reference 错误:

Unresolved reference error, IntelliJ

这变得非常烦人,因为几乎所有文件都被IntelliJ标记,好像它们包含致命错误,即使你可以毫无问题地构建它们。

在检查模块依赖关系时,我发现IntelliJ确实认为该模块依赖于两个Kotlin标准库:

Module dependencies in IntelliJ

我发现如果从此列表中删除kotlin-stdlib-1.2.21依赖项,IntelliJ将停止显示 Unresolved reference 错误。不幸的是,在使用Gradle重新同步项目时,依赖性又回来了。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:4)

https://discuss.gradle.org/t/how-do-i-exclude-specific-transitive-dependencies-of-something-i-depend-on/17991中所述,您可以使用以下代码排除特定的依赖关系:

compile('com.example.m:m:1.0') {
   exclude group: 'org.unwanted', module: 'x'
}
compile 'com.example.l:1.0'

这会将模块x排除在m的依赖项之外,但如果您依赖l,它仍然会带来它。

在您的情况下,只需

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5") {
  exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-common'
}

会阻止gradle加载kotlin-stdlib-common依赖kotlinx-coroutines作为依赖项,但仍会添加您指定的kotlin-stdlib-common