Estoy usando Kotlin para crear un servicio web y me topé con lo que considero una extraña curiosidad. Con este 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" }Me sale este error durante la compilación:
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) Bien, no hay problema, jackson-module-kotlin está incorporando las dependencias de kotlin 1.3. Puedo excluirlos. Pero lo que me llamó la atención fue la segunda línea. kotlin-stdlib-jdk8 también está kotlin-stdlib-jdk7 . De hecho, puedo excluirlo y todo sigue funcionando como se esperaba:
compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion") { exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib-jdk7" } ¿Por qué kotlin-stdlib-jdk8 está introduciendo en mi classpath el kotlin-stdlib-jdk7 aparentemente innecesario?
La advertencia que ve durante la compilación ocurre porque la dependencia jackson-module-kotlin:2.9.8 aparentemente trae kotlin-stdlib:1.3.10 al classpath y esa versión anula su dependencia declarada en 1.2.71. Para evitar advertencias, debe migrar su proyecto a Kotlin 1.3.x o degradar la dependencia de jackson-module-kotlin a alguna versión anterior que dependa de Kotlin 1.2.x.
kotlin-stdlib-jdk8 es una adición sobre kotlin-stdlib-jdk7 , y la última es una adición sobre kotlin-stdlib . No debe excluir estas dependencias transitivas, de lo contrario, podría obtener errores de tiempo de ejecución.
El kotlin-stdlib-common , kotlin-stdlib-jdk7 y kotlin-stdlib-jdk8 parecen ser mutuamente excluyentes por lo que pude ver dentro de los frascos. Es por eso que necesita el artefacto jdk7 incluso si usa jdk8.
El kotlin-stdlib-jdk7 solo contiene cosas que se agregaron en JDK7 como AutoCloseable y otras API internas. Esto no está incluido en el artefacto JDK8, que solo incluye elementos agregados en JDK8.
Si no usa las funciones globales use o closeFinally , su código debería funcionar bien sin el artefacto jdk7, pero no hay una razón real para excluir este jar en mi humilde opinión.