为什么Kotlin JDK8在类路径上也包含Kotlin JDK7?

时间:2019-03-22 19:01:30

标签: 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"
}

在编译过程中出现此错误:

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)

好的,没问题,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"
}

为什么kotlin-stdlib-jdk8似乎没有必要的kotlin-stdlib-jdk7拖到我的班级路径上?

2 个答案:

答案 0 :(得分:1)

在编译期间看到的警告发生是因为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-jdk8kotlin-stdlib-jdk7之上的加法,而后者是kotlin-stdlib之上的加法。您不应排除这些传递性依赖项,否则可能会遇到运行时错误。

答案 1 :(得分:-1)

我在罐子里看到的kotlin-stdlib-commonkotlin-stdlib-jdk7kotlin-stdlib-jdk8似乎是互斥的。这就是为什么即使使用jdk8也需要jdk7工件的原因。

kotlin-stdlib-jdk7 jar仅包含在JDK7中添加的内容,例如AutoCloseable和其他内部api。这未包含在JDK8工件中,该工件仅包含JDK8中添加的内容。

如果您不使用usecloseFinally全局函数,那么在没有jdk7工件的情况下,您的代码应该可以正常工作,但是没有真正的理由排除此jar恕我直言。