为什么 Kotlin JDK8 还在类路径中包含 Kotlin JDK7?

Nat*_*han 4 java gradle kotlin

我正在使用 Kotlin 构建一个 Web 服务,我偶然发现了一个我认为很奇怪的好奇心。有了这个 build.gradle:

group 'com.example'
version '0.1.0'

buildscript {
    ext.kotlinVersion = '1.2.71'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    }
}

apply plugin: 'kotlin'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion"
    compile 'com.fasterxml.jackson.module:jackson-module-kotlin:2.9.8'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
Run Code Online (Sandbox Code Playgroud)

我在编译过程中收到此错误:

w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath:
    .../kotlin-stdlib-jdk8-1.2.71.jar (version 1.2)
    .../kotlin-stdlib-jdk7-1.2.71.jar (version 1.2)
    .../kotlin-reflect-1.3.10.jar (version 1.3)
    .../kotlin-stdlib-1.3.10.jar (version 1.3)
    .../kotlin-stdlib-common-1.3.10.jar (version 1.3)
Run Code Online (Sandbox Code Playgroud)

好的,没问题,jackson-module-kotlin正在拉入 kotlin 1.3 依赖项。我可以排除它们。但引起我注意的是第二行。kotlin-stdlib-jdk8也拉进来了kotlin-stdlib-jdk7。事实上,我可以排除它,一切仍然按预期运行:

compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion") {
    exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib-jdk7"
}
Run Code Online (Sandbox Code Playgroud)

为什么kotlin-stdlib-jdk8拉入我的类路径似乎没有必要kotlin-stdlib-jdk7

Ily*_*lya 5

您在编译期间看到的警告发生是因为jackson-module-kotlin:2.9.8依赖项显然kotlin-stdlib:1.3.10带入了类路径,并且该版本覆盖了您在 1.2.71 上声明的依赖项。为避免警告,您应该将您的项目迁移到 Kotlin 1.3.x 或将jackson-module-kotlin依赖项降级到某些依赖于 Kotlin 1.2.x 的先前版本。

kotlin-stdlib-jdk8是在 之上的加法kotlin-stdlib-jdk7,后者是在 之上的加法kotlin-stdlib。您不应排除这些传递依赖项,否则您可能会遇到运行时错误。