我刚开始从Java转换到Kotlin。我有一个问题:当我反映像:XXClass::class.java
或其他任何东西时。它们不适用于JAR,但可以在IDE中正常工作。
我正在使用gradle :module:build
或gradle :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"
}
}
有人能帮我一把吗?非常感谢。
问题出在这个脚本块中
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
您已经使用实现配置包含了依赖项(kotlin-reflect),但是从编译配置中收集了依赖项。如果您将配置从实现更改为编译,则此块将起作用。由于不推荐编译,您可以尝试这样的方法来收集jar的依赖项
compileJava.classpath.collect {
it.isDirectory() ? it : zipTree(it)
}
看到这个answer