Spring Boot 2&Kotlin 1.2.1:过时的运行时间

问题

我试图运行最新的kotlin版本(1.2.10),也是最新的spring boot(2.0.0.M7)。 在当地的环境一切都很好,但是–boottime intellij哭泣: 在这里输入图像说明

我已经看到过时的Kotlin运行时间 ,但在我看来,这是不连接所以…这是可疑的,因为我的以下build.gradle,只有一个版本的kotlin(只有一个)[前端也是gradle build,但node.js one – angular,no kotlin deps]:

buildscript { ext { kotlinVersion = '1.2.10' springBootVersion = '2.0.0.M7' } repositories { mavenCentral() maven { url "https://repo.spring.io/snapshot" } maven { url "https://repo.spring.io/milestone" } maven { url "http://repo.spring.io/libs-milestone-local" } } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}") classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}") classpath 'org.springframework:springloaded:1.2.6.RELEASE' } } apply plugin: 'kotlin' apply plugin: 'kotlin-spring' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' apply plugin: 'idea' group = 'com.witkups' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 idea { module { inheritOutputDirs = false outputDir = file("$buildDir/classes/main/") } } compileKotlin { kotlinOptions.jvmTarget = "1.8" } compileTestKotlin { kotlinOptions.jvmTarget = "1.8" } repositories { mavenCentral() maven { url "https://repo.spring.io/snapshot" } maven { url "https://repo.spring.io/milestone" } maven { url "http://repo.spring.io/libs-milestone-local" } } dependencies { compile project(":frontend") compile('org.springframework.boot:spring-boot-starter-actuator') compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.springframework.boot:spring-boot-starter-security') compile('org.springframework.boot:spring-boot-starter-webflux') compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}") runtime('org.springframework.boot:spring-boot-devtools') runtime('com.microsoft.sqlserver:mssql-jdbc') compile('com.fasterxml.jackson.datatype:jackson-datatype-jsr310') compile('com.fasterxml.jackson.module:jackson-module-kotlin:2.9.2') compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}") compile("io.jsonwebtoken:jjwt:0.7.0") testCompile('com.h2database:h2') testCompile('org.springframework.security:spring-security-test') testCompile('org.springframework.boot:spring-boot-starter-test') testCompile('io.projectreactor:reactor-test') } 

而且因为建立警告而担心我(我猜测测试失败):

 w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath: /home/travis/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.2.10/19bc012f8c4cd6b705bd6512263777cc19bcf259/kotlin-reflect-1.2.10.jar (version 1.2) /home/travis/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.2.10/71c98c16b4bed3f754c6c398f9da8300ecb0a669/kotlin-stdlib-jre8-1.2.10.jar (version 1.2) /home/travis/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.61/59dfce93b1995717338435dd974884007d8e8474/kotlin-stdlib-jre7-1.1.61.jar (version 1.1) /home/travis/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.61/fa7813a26c548c9c412dd2d42fb466cfcd8dcf3c/kotlin-stdlib-1.1.61.jar (version 1.1) w: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath or use '-Xskip-runtime-version-check' to suppress this warning :spring-boot-server:compileTestJava NO-SOURCE :spring-boot-server:processTestResources :spring-boot-server:testClasses :spring-boot-server:testPicked up _JAVA_OPTIONS: -Xmx2048m -Xms512m com.witkups.carsharing.CarSharingApplicationTests > contextLoads FAILED java.lang.IllegalStateException Caused by: java.lang.IllegalStateException Caused by: java.lang.NoClassDefFoundError Caused by: java.lang.ClassNotFoundException 1 test completed, 1 failed :spring-boot-server:test FAILED 

测试:

 package com.witkups.carsharing import org.junit.Test import org.junit.runner.RunWith import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.junit4.SpringRunner @RunWith(SpringRunner::class) @SpringBootTest class CarSharingApplicationTests { @Test fun contextLoads() { } } 

任何帮助将不胜感激:) PS:JDK 8


我在build.gradle脚本中添加了以下几行:

 compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}") compile("org.jetbrains.kotlin:kotlin-stdlib-jre7:${kotlinVersion}") compile("org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}") 

像魅力一样工作。 当我替换时,测试停止失败

 @RunWith(SpringRunner::class) 

 @ExtendWith(SpringExtension::class) 

你的一个依赖本身依赖于kotlin-stdlib-jre7 。 就Gradle所知, kotlin-stdlib-jre7kotlin-stdlib-jre8是完全不相关的,所以它将两个放在classpath中,这导致了condlict。

尝试使用./gradlew dependencyInsight kotlin-stdlib-jre7来查看依赖关系来自哪里并排除它 。 例如,如果它变成jackson-module-kotlin ,写

 compile('com.fasterxml.jackson.module:jackson-module-kotlin:2.9.2') { exclude group: "org.jetbrains.kotlin" } 

另请参阅https://docs.gradle.org/current/userguide/dependency_management.html#sub:version_conflicts 。

根据Kotlin 1.2中的新增function,Java 7和8有一些新的依赖项,例如kotlin-stdlib-jdk8而不是旧的kotlin-stdlib-jre8 。 使用这个自动修复kotlin-stdlib-jdk7的暂时导入,但不幸的是不适用于kotlin-stdlib 。 现在还是1.1.61

 ./gradlew dependencyInsight --dependency kotlin-stdlib > Task :dependencyInsight org.jetbrains.kotlin:kotlin-stdlib:1.1.61 (selected by rule) org.jetbrains.kotlin:kotlin-stdlib:1.2.10 -> 1.1.61 +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.10 | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.10 | \--- compileClasspath \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.10 (*) org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.10 \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.10 \--- compileClasspath org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.10 (selected by rule) org.jetbrains.kotlin:kotlin-stdlib-jdk8: -> 1.2.10 \--- compileClasspath (*) - dependencies omitted (listed previously) 

你也可以用明确的版本声明kotlin-stdlib来修正警告。

 compile("org.jetbrains.kotlin:kotlin-stdlib:1.2.10") compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")