Kotlin总是告诉我KotlinReflectionNotSupportedError

时间:2019-01-04 17:42:26

标签: gradle kotlin jar

我刚刚开始从Java转换为Kotlin。我有一个问题:当我反映以下内容时: XXClass::class.java 或其他任何东西。它们不能在JAR中运行,但可以在IDE中正常运行。

我正在使用gradle :module:buildgradle :module:jar来生成JAR文件。生成后,它总是告诉我KotlinReflectionNotSupportedError: Kotlin reflection implementation is not found at runtime. Make sure you have kotlin-reflect.jar in the classpath。但是我已经将它们添加到依赖项中,并且它们在IDE中可以正常工作。

这些是我的gradle文件的一部分(请注意,这是一个kotlin应用程序模块,而不是Android模块):

// (Module level)
apply plugin: 'kotlin'
sourceCompatibility = 1.8
dependencies {
    // Others...
    // I've already added reflect and stdlib
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
}

jar {
    manifest {
        // ...
    }

    // To include dependencies to build a fat jar
    from {
        configurations.compile.collect { 
            it.isDirectory() ? it : zipTree(it) 
        }
    }
}

// Include reflect and stdlib
compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
        javaParameters = true
        noReflect = false
        noStdlib = false
    }
}

// (Project level)
buildscript {
    ext.kotlin_version = '1.3.11'
    repositories {
        // ...
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

有人可以帮我吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

问题出在这个脚本块中

        configurations.compile.collect { 
            it.isDirectory() ? it : zipTree(it) 
        }

您已经使用实现配置包含了依赖项(kotlin-reflect),但是从 compile 配置中收集了依赖项。如果您将配置从实现更改为编译,则此块将起作用。由于 compile 已被弃用,因此您可以尝试使用类似方法将依赖项收集到jar中

        compileJava.classpath.collect {
            it.isDirectory() ? it : zipTree(it)
        }

查看此answer