Java 为什么Kotlin JDK8在类路径上也包含Kotlin JDK7? 我用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" }
我在编译过程中遇到此错误:Java 为什么Kotlin JDK8在类路径上也包含Kotlin JDK7? 我用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" },java,gradle,kotlin,Java,Gradle,Kotlin,我在编译过程中遇到此错误: 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-
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模块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
拉到我的类路径上?kotlin-stdlib-jdk8常见的,kotlin-stdlib-jdk7
和kotlin-stdlib-jdk8
似乎与我在罐子里看到的东西是相互排斥的。这就是为什么即使使用jdk8,也需要jdk7工件
kotlin-stdlib-jdk7
jar只包含jdk7中添加的东西,如AutoCloseable
和其他内部api。这不包括在JDK8工件中,它只包括在JDK8中添加的东西
如果不使用use
或closeFinally
全局函数,代码在没有jdk7工件的情况下应该可以正常工作,但是没有真正的理由排除这个jar IMHO。编译过程中出现的警告是因为jackson模块kotlin:2.9.8
依赖项显然将kotlin stdlib:1.3.10
引入类路径,并且该版本覆盖了您在1.2.71上声明的依赖项。为了避免警告,您应该将项目迁移到Kotlin 1.3.x,或者将依赖于Kotlin 1.2.x的jackson module Kotlin降级到某个早期版本
kotlin-stdlib-jdk8
是在kotlin-stdlib-jdk7
之上添加的,后者是在kotlin stdlib
之上添加的。您不应该排除这些可传递的依赖项,否则可能会出现运行时错误。我相信它们只是在jdk8依赖项中包含了java 8特定的内容,而将所有java 7+内容都保留在jdk7依赖项中。所以你需要两者都有完整的stdlib。我想你也有普通的stdlib,不是吗?谢谢。“kotlin-stdlib-jdk8
是在kotlin-stdlib-jdk7
的基础上添加的,后者是在kotlin-stdlib
的基础上添加的。”这是我正在寻找的答案。正如我在问题中提到的,我知道错误的原因是jackson module kotlin
。请注意,如果jackson module kotlin
使用kotlin 1.3中添加的一些新函数,它在运行时将无法与kotlin 1.2.x依赖项一起工作。