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

时间:2017-12-25 05:53:04

标签: spring-boot kotlin

问题

我正在尝试使用最新的春季启动(2.0.0.M7)运行最新的kotlin版本(1.2.10)。 在当地的环境中一切都很好,但是-boottime intellij哭了:enter image description here

我见过Outdated Kotlin Runtime,但在我看来它并没有这样连接......这是可疑的,因为我的后续build.gradle,只有一个版本的kotlin(只有一个)[前端]也是gradle构建但是node.js是一个 - 有角度的,没有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)

2 个答案:

答案 0 :(得分:4)

您的某个依赖项本身取决于kotlin-stdlib-jre7。就Gradle而言,kotlin-stdlib-jre7kotlin-stdlib-jre8完全不相关,因此它将两者放在类路径上,从而导致了condlict。

尝试./gradlew dependencyInsight kotlin-stdlib-jre7查看依赖项的来源和exclude it。例如。如果结果是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

答案 1 :(得分:4)

根据What's New in Kotlin 1.2,Java 7和8有新的依赖关系,例如: G。 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")