Gradle项目:java.lang.NoClassDefFoundError:kotlin/jvm/internal/Intrinsics

Gradle项目:java.lang.NoClassDefFoundError:kotlin/jvm/internal/Intrinsics,java,exception,exception-handling,kotlin,Java,Exception,Exception Handling,Kotlin,我正在从事一个Java项目,在这个项目中,我第一次尝试了Kotlin。我开始使用Intellij Idea中提供的JavaToKoltin转换器将一些类转换为Kotlin。除此之外,我的自定义异常现在已转换为Kotlin。但是在这种情况下,异常处理不再正常工作。 如果我在java代码中抛出一个自定义异常(例如,MyCustomKotlinException.kt),则不会捕获该异常(请参见下面的代码) 更新: 我将抛出部分分成两行(实例创建和抛出),发现问题不在于抛出。创建实例后,try块将保留

我正在从事一个Java项目,在这个项目中,我第一次尝试了Kotlin。我开始使用Intellij Idea中提供的JavaToKoltin转换器将一些类转换为Kotlin。除此之外,我的自定义异常现在已转换为Kotlin。但是在这种情况下,异常处理不再正常工作。
如果我在java代码中抛出一个自定义异常(例如,
MyCustomKotlinException.kt
),则不会捕获该异常(请参见下面的代码)

更新:
我将抛出部分分成两行(实例创建和抛出),发现问题不在于抛出。创建实例后,try块将保留。我创建这个Kotlin类的实例有什么问题吗

更新2:
我用
Throwable
添加了第二个catch块,并捕获了以下Throwable

java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
更新3:
将标题更改为更正错误,并修复了将所有项目文件添加到jar的问题(请参阅下面的答案)。
将Kotlin运行时库添加到gradle对我不起作用。

我要说的是,您正在尝试在没有
Kotlin运行时库的情况下运行Kotlin代码


检查您正在使用的系统并添加必要的jar文件。您可以通过将项目打包到
.jar
文件中,并使用将所有项目文件添加到jar中来验证这是您的问题,从而为我解决了这个问题。我将以下行添加到我的
build.gradle

jar {
    manifest {
        attributes ...
    }
    // This line of code recursively collects and copies all of a project's files
    // and adds them to the JAR itself. One can extend this task, to skip certain
    // files or particular types at will
    from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}

更新:更改了
配置。编译。收集
配置。编译CLASSPATH。收集
,根据下面的答案。

您需要使用kotlin配置您的项目。 所以在Android Studio中:

  • 单击Tools=>kotlin=>ConfigureKotlin-inProject

  • 然后在对话框中检查:包含kotlin文件的所有模块

  • 然后选择“版本”

  • 按ok


  • 完成。

    也有同样的问题,在控制台中使用Ant编译我的项目。我已将kotlin-stdlib.jar插入类路径中,问题已经解决。

    在我的情况下,settings.gradle中的
    enableFeaturePreview
    在迁移到kotlin 1.3时导致了这个问题。

    添加以下内容为我解决了这个问题:

    dependencies {
        "kotlinCompilerClasspath"(fileTree("libs/gradle-plugins/kotlin"))
    }
    
    以下是
    libs/gradle plugins/kotlin
    的内容:

    annotations-13.0.jar
    commons-codec-1.9.jar
    commons-logging-1.2.jar
    gradle-download-task-3.4.3.jar
    gson-2.8.5.jar
    httpclient-4.5.3.jar
    httpcore-4.4.6.jar
    kotlin-android-extensions-1.3.40.jar
    kotlin-annotation-processing-gradle-1.3.40.jar
    kotlin-build-common-1.3.40.jar
    kotlin-compiler-1.3.40.jar
    kotlin-compiler-embeddable-1.3.40.jar
    kotlin-compiler-runner-1.3.40.jar
    kotlin-daemon-client-1.3.40.jar
    kotlin-gradle-plugin-1.3.40.jar
    kotlin-gradle-plugin-api-1.3.40.jar
    kotlin-gradle-plugin-model-1.3.40.jar
    kotlin-reflect-1.3.40.jar
    kotlin-runtime-1.2.71.jar
    kotlin-script-runtime-1.3.40.jar
    kotlin-scripting-common-1.3.40.jar
    kotlin-scripting-compiler-embeddable-1.3.40.jar
    kotlin-scripting-compiler-impl-embeddable-1.3.40.ja
    kotlin-scripting-jvm-1.3.40.jar
    kotlin-stdlib-1.3.40.jar
    kotlin-stdlib-common-1.3.40.jar
    kotlin-stdlib-jdk7-1.3.40.jar
    kotlin-stdlib-jdk8-1.3.40.jar
    kotlinx-coroutines-core-1.1.1.jar
    org.jetbrains.kotlin.jvm.gradle.plugin-1.3.40.jar
    trove4j-1.0.20181211.jar
    

    完整的
    gradle.build.kts
    (脱机设置):

    buildscript{
    依赖关系{
    类路径(文件树(“libs/gradle插件/kotlin”))
    }
    }
    插件{
    JAVA
    `java库`
    }
    应用(plugin=“kotlin”)
    version=“2019.06.1”
    tasks.withType{
    kotlinOptions.jvmTarget=“12”
    }
    存储库{
    弗拉蒂尔{
    dirs(“libs/compile”)
    目录(“LIB/已提供”)
    }
    }
    依赖关系{
    “kotlinCompilerClasspath”(文件树(“libs/gradle plugins/kotlin”))
    编译(:javaee-api-8.0)
    api(“kotlin-stdlib-common-1.3.40”)
    api(“kotlin-stdlib-1.3.40”)
    api(“kotlin-stdlib-jdk7-1.3.40”)
    api(“kotlin-stdlib-jdk8-1.3.40”)
    api(“gson-2.8.5”)
    }
    
    谢谢你的评论。实际上,
    compile
    已被弃用。但是,公认的答案不适用于
    实施
    。所以我查找了
    实现
    依赖于compileClasspath

    因此,我现在的解决方案是添加

    jar {
        manifest {
            attributes ...
        }
        // This line of code recursively collects and copies all of a project's files
        // and adds them to the JAR itself. One can extend this task, to skip certain
        // files or particular types at will
        from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    }
    

    我觉得这应该由org.jetbrains.kotlin.jvm插件来完成


    在build.gradle文件的依赖项中使用
    compile
    而不是
    implementation
    为我解决了这个问题。

    这个错误可能是因为简单jar任务没有获取其所有运行时依赖项

    从中,在您的
    build.gradle.kts
    中,您可以创建一个“fatJar”任务或将其添加到您的jar任务中:

    tasks.withType<Jar> {
        // Otherwise you'll get a "No main manifest attribute" error
        manifest {
            attributes["Main-Class"] = "com.example.MainKt"
        }
    
        // To add all of the dependencies
        from(sourceSets.main.get().output)
    
        dependsOn(configurations.runtimeClasspath)
        from({
            configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
        })
    }
    
    tasks.withType{
    //否则会出现“无主清单属性”错误
    显示{
    属性[“主类”]=“com.example.MainKt”
    }
    //添加所有依赖项
    from(sourceset.main.get().output)
    dependsOn(configurations.runtimeClasspath)
    从({
    configurations.runtimeClasspath.get().filter{it.name.endsWith(“jar”)}.map{zipTree(it)}
    })
    }
    
    请提供完整的源代码,例如kotlin源代码。@GhostCat这对您来说够了吗?它需要足够,以便人们可以重新编写该问题。看起来像现在一样。@FreshD我无法用您提供的代码重现问题。@Christian是的,您是对的。我刚刚试过这个例子,效果很好。但是exception类看起来是一样的,但是名称不同,而且try catch中的实例创建也是一样的,所以不知道为什么它只适用于这个示例。我尝试将运行库添加到我的
    build.gradle
    compile“org.jetbrains.kotlin:kotlin runtime:$kotlin_version”
    )中,但对我不起作用。太好了!它对我有用。添加“kotlin-runtime-1.2.71.jar”,然后重新生成。那个错误消失了。科特林工作得很有魅力!非常感谢。虽然
    kotlin运行时
    已被弃用,因为
    kotlin stdlib
    实现
    编译
    更新。不应用于replacement@Kishita谢谢你的评论。您完全正确,不应再使用compile。我正在寻找一个更好的替代方案,并更新了我的答案。哦,顺便说一句,你不能使用configurations.implementation.collect或configurations.api.collect的原因是它们无法解决。现在使用
    配置。compileClasspath
    而不是
    配置。按照上面提到的@simon-o编译
    。你能,请一步一步地告诉我您是如何生成项目的JAR的?我在这方面遇到了很大的问题,如何在
    build.gradle.kts
    上执行此操作?@mending 3如果将上述行添加到
    build.gradle.kts
    中会发生什么?
    buildscript {
        dependencies {
            classpath(fileTree("libs/gradle-plugins/kotlin"))
        }
    }
    
    plugins {
        java
        `java-library`
    }
    
    apply(plugin = "kotlin")
    
    version = "2019.06.1"
    
    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
        kotlinOptions.jvmTarget = "12"
    }
    
    repositories {
        flatDir {
            dirs("libs/compile")
            dirs("libs/provided")
        }
    }
    
    dependencies {
        "kotlinCompilerClasspath"(fileTree("libs/gradle-plugins/kotlin"))
        compileOnly(":javaee-api-8.0")
        api(":kotlin-stdlib-common-1.3.40")
        api(":kotlin-stdlib-1.3.40")
        api(":kotlin-stdlib-jdk7-1.3.40")
        api(":kotlin-stdlib-jdk8-1.3.40")
        api(":gson-2.8.5")
    }
    
    jar {
        manifest {
            attributes ...
        }
        // This line of code recursively collects and copies all of a project's files
        // and adds them to the JAR itself. One can extend this task, to skip certain
        // files or particular types at will
        from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    }
    
    dependencies {
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.50"
        //...
    }
    
    tasks.withType<Jar> {
        // Otherwise you'll get a "No main manifest attribute" error
        manifest {
            attributes["Main-Class"] = "com.example.MainKt"
        }
    
        // To add all of the dependencies
        from(sourceSets.main.get().output)
    
        dependsOn(configurations.runtimeClasspath)
        from({
            configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
        })
    }