Почему Kotlin JDK8 также включает Kotlin JDK7 в путь к классам? - PullRequest
1 голос
/ 22 марта 2019

Я использую Kotlin для создания веб-сервиса и наткнулся на то, что я считаю странным любопытством.С этим 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 ]

1 голос
/ 23 марта 2019

Предупреждение, которое вы видите во время компиляции, происходит потому, что зависимость 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.Вы не должны исключать эти переходные зависимости, иначе вы можете получить ошибки времени выполнения.

0 голосов
/ 22 марта 2019

kotlin-stdlib-common, kotlin-stdlib-jdk7 и kotlin-stdlib-jdk8 кажутся взаимоисключающими от того, что я мог видеть внутри банок.Вот почему вам нужен артефакт jdk7, даже если вы используете jdk8.

В банке kotlin-stdlib-jdk7 содержатся только те вещи, которые были добавлены в JDK7, такие как AutoCloseable и другие внутренние apis.Это не входит в артефакт JDK8, который включает только вещи, добавленные в JDK8.

Если вы не используете глобальные функции use или closeFinally, ваш код должен работать без артефакта jdk7,но нет реальной причины исключать эту банку ИМХО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...