jsoizo/kotlin-csv

java.lang.NoClassDefFoundError: mu/KotlinLogging

ltpquang opened this issue ยท 6 comments

Describe the problem

It quite not a bug, but I'm stuck on this exception:

Caused by: java.lang.NoClassDefFoundError: mu/KotlinLogging
	at com.github.doyaaaaaken.kotlincsv.client.CsvFileReader.<init>(CsvFileReader.kt:21)
	at com.github.doyaaaaaken.kotlincsv.client.CsvReader.open(CsvReader.kt:129)
	at com.github.doyaaaaaken.kotlincsv.client.CsvReader.readAll(CsvReader.kt:48)

It happens only on Ubuntu. MacOS is still fine.

Environment

  • kotlin-csv version: 0.11.0
  • java version: java8
  • kotlin version: 1.4.10
  • OS: Ubuntu 18.04.5

Any suggestion on this? Thank you!

In my case the Maven try to resolve mu/KotlinLogging via JitPack.io instead of Maven Central, and receive an empty Jar, causing such exception.

@ltpquang OK, thanks for reporting ๐Ÿ™‡

I have the same issue with the kotlin script feature.
It looks like:

java.lang.NoClassDefFoundError: mu/KotlinLogging
        at com.github.doyaaaaaken.kotlincsv.client.CsvFileReader.<init>(CsvFileReader.kt:21)
        at com.github.doyaaaaaken.kotlincsv.client.CsvReader.open(CsvReader.kt:176)
        at com.github.doyaaaaaken.kotlincsv.client.CsvReader.readAllWithHeader(CsvReader.kt:58)
        at Kotlin_test_main$1.invoke(kotlin-test.main.kts:33)
        at Kotlin_test_main$1.invoke(kotlin-test.main.kts:14)
        at com.xenomachina.argparser.SystemExitExceptionKt.mainBody(SystemExitException.kt:74)
        at com.xenomachina.argparser.SystemExitExceptionKt.mainBody$default(SystemExitException.kt:72)
        at Kotlin_test_main.<init>(kotlin-test.main.kts:26)
Caused by: java.lang.ClassNotFoundException: mu.KotlinLogging
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:435)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)

And this my script:

#!/usr/bin/env kotlin

@file:Repository("https://jcenter.bintray.com")
@file:DependsOn("com.xenomachina:kotlin-argparser:2.0.7")
@file:DependsOn("com.github.doyaaaaaken:kotlin-csv-jvm:0.13.0")


import com.github.doyaaaaaken.kotlincsv.dsl.csvReader
import com.xenomachina.argparser.ArgParser
import com.xenomachina.argparser.mainBody
import java.io.File

class MyArgs(parser: ArgParser) {
    val verbose by parser.flagging(
            "-v", "--verbose",
            help = "enable verbose mode")

    val source by parser.positional(
            "SOURCE",
            help = "source filename")
}

mainBody {
    ArgParser(args).parseInto(::MyArgs).run {
        if (verbose) {
            println("Parsing source file: $source")
        }

        val csvData: String = "a,b,c\nd,e,f"
        val rows: List<Map<String, String>> = csvReader().readAllWithHeader(csvData)
        println(rows)
    }
}

Any suggestion?

Anyway, your parser looks great! Thank you for your job!

Hi, @and-marsh !
I'm sorry I'm not familiar with the kotlin script feature, but I'll try to describe the cause I imagine.

As you could see this line, kotlin-csv uses kotlin-logging as a logging library.

And the kotlin-logging depends on slf4j-api, so maybe you would need to add a concrete logger library like logback.
https://github.com/MicroUtils/kotlin-logging#download

Important note: kotlin-logging depends on slf4j-api (in the JVM artifact). In runtime, it is also required to depend on a logging implementation. More details in how-to-configure-slf4j. And an excellent detailed explanation in a-guide-to-logging-in-java.

@and-marsh I am using kotlin script too and the imporing of kotlin-logging works for me. My file is like this:

#!/usr/bin/env kotlin

@file:Repository("https://jcenter.bintray.com")
@file:DependsOn("io.github.microutils:kotlin-logging-jvm:2.0.2")
@file:DependsOn("com.github.doyaaaaaken:kotlin-csv-jvm:0.11.0")

Hey,
I ran into a similar error:

org.gradle.internal.resolve.ModuleVersionResolveException: 
Could not resolve io.github.microutils.kotlin-logging:kotlin-logging-common:1.7.9.

but I was able to resolve it by adding the following to my build.gradle file:

implementation 'io.github.microutils:kotlin-logging:1.12.5'

(for some reason implementation 'io.github.microutils:kotlin-logging-jvm:2.0.10' didn't work)