我正在使用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
拖到我的班级路径上?
答案 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-jdk8
是kotlin-stdlib-jdk7
之上的加法,而后者是kotlin-stdlib
之上的加法。您不应排除这些传递性依赖项,否则可能会遇到运行时错误。
答案 1 :(得分:-1)
我在罐子里看到的kotlin-stdlib-common
,kotlin-stdlib-jdk7
和kotlin-stdlib-jdk8
似乎是互斥的。这就是为什么即使使用jdk8也需要jdk7工件的原因。
kotlin-stdlib-jdk7
jar仅包含在JDK7中添加的内容,例如AutoCloseable
和其他内部api。这未包含在JDK8工件中,该工件仅包含JDK8中添加的内容。
如果您不使用use
或closeFinally
全局函数,那么在没有jdk7工件的情况下,您的代码应该可以正常工作,但是没有真正的理由排除此jar恕我直言。