Gradle-Projekt: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

Lesezeit: 6 Minuten

Benutzer-Avatar
FreshD

Ich arbeite an einem Java-Projekt und innerhalb dieses Projekts habe ich meinen ersten Versuch mit Kotlin unternommen. Ich habe damit begonnen, einige Klassen mit dem JavaToKoltin-Konverter, der in der Intellij-Idee enthalten ist, in Kotlin zu konvertieren. Unter anderem werden meine benutzerdefinierten Ausnahmen jetzt in Kotlin konvertiert. Damit funktioniert aber die Ausnahmebehandlung nicht mehr richtig.
Wenn ich eine meiner benutzerdefinierten Ausnahmen auslöse (z MyCustomKotlinException.kt) innerhalb des Java-Codes wird die Ausnahme nicht abgefangen (siehe Code unten).

// Example.java
package foo    

import java.util.*;
import java.lang.*;
import java.io.*;
import foo.MyCustomKotlinException;

class Example
{
    public static void main (String[] args)
    {
        try {
            // Do some stuff
            // if Error
            MyCustomKotlinException e = new MyCustomKotlinException("Error Message");
            throw e;
        } catch (MyCustomKotlinException e) {  // <-- THIS PART IS NEVER REACHED
            // Handle Exception
        } catch (Throwable e) {
            e.printStackTrace(); <-- This is catched
        } finally {
            // Finally ...
        }
    }
}

Kann mir also jemand erklären, warum die Ausnahme nicht gefangen wird. MyCustomKotlinException erbt von Kotlins RuntimeExceptionwas nur ein Alias ​​für ist java.lang.RuntimeException.

// MyCustomKotlinException.kt
package foo

class MyCustomKotlinException(err: String) : RuntimeException(err)

Aktualisieren:

Ich habe den Throw-Teil in 2 Zeilen aufgeteilt (Instanzerstellung und Throwing) und festgestellt, dass das Problem nicht das Throwing ist. Der try-Block wird nach der Instanzerstellung verlassen. Stimmt etwas mit meiner Instanzerstellung dieser Kotlin-Klasse nicht?

Update2:

Ich habe einen zweiten catch-Block mit hinzugefügt Throwable und das folgende Throwable wird gefangen.

java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics

Update3:

Der Titel wurde geändert, um den Fehler zu korrigieren, und das Problem beim Hinzufügen aller Projektdateien zur JAR-Datei behoben (siehe Antwort unten). Das Hinzufügen der Kotlin-Laufzeitbibliothek zu Gradle funktioniert bei mir nicht.

  • Bitte geben Sie ein vollständiges, reproduzierbares Minimalbeispiel an, beispielsweise mit diesem Kotlin-Quellcode.

    – Geisterkatze

    26. Mai 2017 um 8:59 Uhr

  • @GhostCat reicht dir das?

    – FreshD

    26. Mai 2017 um 9:13 Uhr

  • Es muss ausreichen, damit die Leute das Problem reproduzieren können. Sieht aus wie jetzt.

    – Geisterkatze

    26. Mai 2017 um 9:14 Uhr

  • @FreshD Ich kann das Problem mit dem von Ihnen bereitgestellten Code nicht reproduzieren.

    – Christian Brüggemann

    26. Mai 2017 um 11:50 Uhr

  • @Christian Ja, du hast recht. Ich habe es gerade mit diesem Beispiel versucht und es funktioniert. Aber die Ausnahmeklasse sieht gleich aus, aber mit einem anderen Namen, und auch die Instanzerstellung im try catch ist gleich, also keine Ahnung, warum es nur für das Beispiel funktioniert.

    – FreshD

    26. Mai 2017 um 12:01 Uhr


Benutzer-Avatar
FreshD

Das Hinzufügen aller Projektdateien zum JAR hat das Problem für mich behoben. Ich habe die folgende Zeile zu meiner hinzugefügt 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) } }
}

Aktualisieren: Geändert configurations.compile.collect zu configurations.compileClasspath.collect gemäß dieser Antwort unten.

  • Verwenden configurations.compileClasspath jetzt statt configurations.compile wie @simon-o oben erwähnt.

    – Chris

    16. Februar 2020 um 19:27 Uhr

  • Könnten Sie mir bitte Schritt für Schritt erklären, wie Sie die JAR-Datei Ihres Projekts generiert haben? Damit habe ich große Probleme

    – Bruno Azevedo

    12. September 2020 um 1:14 Uhr

  • wie mache ich das weiter build.gradle.kts?

    – ausbessern3

    15. Februar 2021 um 6:45 Uhr

  • @mending3 Was passiert, wenn Sie die obigen Zeilen hinzufügen build.gradle.kts?

    – FreshD

    15. Februar 2021 um 11:23 Uhr

Benutzer-Avatar
Suraj Vaishnav

Sie müssen Ihr Projekt mit Kotlin konfigurieren. Also im Android Studio:

  1. Klicken Sie auf Tools => kotlin => Kotlin im Projekt konfigurieren

  2. Überprüfen Sie dann im Dialog: Alle Module, die Kotlin-Dateien enthalten

  3. und Version auswählen

  4. drücke OK

Fertig.

Dieser Fehler ist wahrscheinlich darauf zurückzuführen, dass die einfache JAR-Aufgabe nicht alle ihre Laufzeitabhängigkeiten übernimmt.

Aus Gradle DokumentationIn deiner build.gradle.kts Sie können entweder eine “fatJar”-Aufgabe erstellen oder diese zu Ihrer JAR-Aufgabe hinzufügen:

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) }
    })
}

  • Danke, als ich auf die Ausnahme von 【ist ein Duplikat, aber es wurde keine Duplikatbehandlungsstrategie festgelegt】 gestoßen bin, habe ich 【duplicatesStrategy = DuplicatesStrategy.EXCLUDE】 hinzugefügt und es war in Ordnung

    – Lancer.Yan

    15. Juni um 4:43

Ich werde sagen, dass Sie versuchen, Kotlin-Code ohne das auszuführen kotlin-runtime Bibliothek

Überprüfen Sie, welches System Sie verwenden, und fügen Sie die erforderliche JAR-Datei hinzu. Sie können überprüfen, ob dies Ihr Problem ist, indem Sie Ihr Projekt in a verpacken .jar Datei und Ausführen mit der Laufzeitbibliothek

Benutzer-Avatar
Simon o

Danke für den Kommentar. In der Tat compile ist veraltet. Die akzeptierte Antwort funktioniert jedoch nicht mit implementation. Also habe ich nachgeschaut Konfiguration des Java-Bibliotheks-Plugins und implementation hängt von compileClasspath ab.

Also ist meine Lösung für jetzt, hinzuzufügen

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) } }
}

mit

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.50"
    //...
}

Ich bin der Meinung, dass dies vom Plugin org.jetbrains.kotlin.jvm erledigt werden sollte.

Verwenden compile Anstatt von implementation in den Abhängigkeiten der build.gradle-Datei hat es für mich gelöst.

  • implementation ist neuer als compile. Sollte nicht als Ersatz verwendet werden

    – Kishita Variya

    30. Oktober 2019 um 11:48 Uhr

  • @Kishita Danke für deinen Kommentar. Sie haben absolut Recht und compilieren sollte nicht mehr verwendet werden. Ich habe nach einer besseren Alternative gesucht und meine Antwort aktualisiert.

    – Simon O

    31. Oktober 2019 um 15:35 Uhr

  • Oh, und übrigens, der Grund, warum Sie configurations.implementation.collect oder configurations.api.collect nicht verwenden können, ist, dass sie nicht aufgelöst werden können.

    – Simon O

    31. Oktober 2019 um 15:37 Uhr

Benutzer-Avatar
Dmitri Kanunnikoff

Hatte das gleiche Problem beim Kompilieren meines Projekts mit Ant in der Konsole. Ich habe kotlin-stdlib.jar in den Klassenpfad eingefügt und das Problem ist verschwunden.

  • implementation ist neuer als compile. Sollte nicht als Ersatz verwendet werden

    – Kishita Variya

    30. Oktober 2019 um 11:48 Uhr

  • @Kishita Danke für deinen Kommentar. Sie haben absolut Recht und compilieren sollte nicht mehr verwendet werden. Ich habe nach einer besseren Alternative gesucht und meine Antwort aktualisiert.

    – Simon O

    31. Oktober 2019 um 15:35 Uhr

  • Oh, und übrigens, der Grund, warum Sie configurations.implementation.collect oder configurations.api.collect nicht verwenden können, ist, dass sie nicht aufgelöst werden können.

    – Simon O

    31. Oktober 2019 um 15:37 Uhr

Benutzer-Avatar
Eng.Fouad

Das Hinzufügen des Folgenden löste das Problem für mich:

dependencies {
    "kotlinCompilerClasspath"(fileTree("libs/gradle-plugins/kotlin"))
}

Hier ist der Inhalt von 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

Das Ganze gradle.build.kts (Offline-Setup):

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")
}

1381640cookie-checkGradle-Projekt: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy