Kotlin 1.3+, ломающий SLF4J / log4j - PullRequest
       18

Kotlin 1.3+, ломающий SLF4J / log4j

0 голосов
/ 12 января 2019

Я пытаюсь обновить проект до Kotlin 1.3, но я столкнулся с проблемой, потому что мы используем HikariCP и ряд других библиотек, использующих SLF4J / log4j, и все они по какой-то причине ломаются на Kotlin 1.3 и выше .

Проблема возникает только при изменении версии Kotlin. Почему изменение Kotlin влияет на поведение SLF4J / log4j?

java.lang.NoSuchMethodError: org.apache.log4j.Level.isGreaterOrEqual(Lorg/apache/log4j/Priority;)Z
    at org.apache.log4j.Category.isDebugEnabled(Category.java:736)
    at org.slf4j.impl.Log4jLoggerAdapter.debug(Log4jLoggerAdapter.java:251)
    at com.zaxxer.hikari.HikariConfig.attemptFromContextLoader(HikariConfig.java:901)
    at com.zaxxer.hikari.HikariConfig.setDriverClassName(HikariConfig.java:474)
    at ps.eden.server.game.system.mysql.SQLManager.init(SQLManager.java:86)

Это конфигурация gradle build, которую мы используем, с той лишь разницей, что у нас есть версия 1.2.71, а не 1.3.11:

buildscript {
    ext.kotlin_version = '1.3.11'

    repositories {
        jcenter()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.2'
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'eclipse'
apply plugin: 'application'

mainClassName = "ps.eden.server.Eden"

group 'ps.eden'
version '1.4.0'

targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_1_8

eclipse {
    classpath {
        containers 'org.jetbrains.kotlin.core.KOTLIN_CONTAINER'
    }
}

compileKotlin {
    kotlinOptions.suppressWarnings = true
}

sourceSets {
    main.kotlin.srcDirs += 'src/main/kotlin'
    main.java.srcDirs += 'src/main/java'
}

repositories {
    jcenter()
    flatDir { dirs 'lib' }
    maven { url 'https://jitpack.io' }
    maven { url "https://dl.bintray.com/kotlin/kotlinx/" }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    compile group: 'org.jetbrains.kotlin', name: 'kotlin-scripting-common', version: "$kotlin_version"
    compile group: 'org.jetbrains.kotlin', name: 'kotlin-scripting-jvm', version: "$kotlin_version"
    compile group: 'org.jetbrains.kotlin', name: 'kotlin-scripting-jvm-host', version: "$kotlin_version"

    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.47'
    compile group: 'joda-time', name: 'joda-time', version: '2.10.1'
    compile(group: 'com.zaxxer', name: 'HikariCP', version: '3.3.0') {
        exclude module: 'slf4j-api'
    }
    compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
    compile group: 'org.apache.commons', name: 'commons-email', version: '1.5'
    compile group: 'org.apache.commons', name: 'commons-compress', version: '1.18'
    compile(group: 'org.apache.hadoop', name: 'hadoop-common', version: '3.1.1') {
        exclude module: 'slf4j-api'
        exclude module: 'slf4j-log4j'
        exclude module: 'slf4j-log412j'
    }
    compile group: 'org.apache.ant', name: 'ant', version: '1.10.5'
    compile group: 'it.unimi.dsi', name: 'fastutil', version: '8.2.2'
    compile group: 'io.netty', name: 'netty-all', version: '4.1.32.Final'
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
    compile group: 'org.reflections', name: 'reflections', version: '0.9.11'
    compile group: 'com.github.salomonbrys.kotson', name: 'kotson', version: '2.5.0'
    compile group: 'com.mashape.unirest', name: 'unirest-java', version: '1.4.9'
    compile 'com.github.rockaport:alice:0.9.0'
    compile group: 'at.favre.lib', name: 'bcrypt', version: '0.6.0'
    compile group: 'net.openhft', name: 'zero-allocation-hashing', version: '0.8'
    compile('net.dv8tion:JDA:3.8.1_437') {
        exclude module: 'opus-java'
    }
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1'
}

compileJava {
    options.encoding = "UTF-8"

    //enable compilation in a separate daemon process
    options.fork = true

    //enable incremental compilation
    options.incremental = true
}

1 Ответ

0 голосов
/ 16 января 2019

Вы используете библиотеки сценариев kotlin, в частности kotlin-scripting-jvm-host, которая извлекает jar компилятора kotlin. Вместо этого вы можете попробовать использовать kotlin-scripting-jvm-host-embeddable: это зависит от "встраиваемой" версии jar-файла компилятора, где связанные классы сторонних производителей "затенены".

Редактировать: kotlin-scripting-jvm-host-embeddable доступен начиная с версии Kotlin 1.3.20 (на момент написания - только в предварительной версии) .

...