web-dev-qa-db-de.com

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

Ich arbeite an einem Java-Projekt und habe in diesem Projekt zum ersten Mal mit Kotlin versucht. Ich habe mit dem Konverter JavaToKoltin in Intellij Idea begonnen, einige Klassen in Kotlin zu konvertieren. Unter anderem werden meine benutzerdefinierten Ausnahmen jetzt in Kotlin konvertiert. Damit funktioniert die Ausnahmebehandlung jedoch nicht mehr korrekt.
Wenn ich eine meiner benutzerdefinierten Ausnahmen (z. B. MyCustomKotlinException.kt) im Java-Code verwende, 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 ...
        }
    }
}

Also kann mir jeder erklären, warum die Ausnahme nicht erwischt wird. MyCustomKotlinException erbt von Kotlins RuntimeException, was nur ein Alias ​​für Java.lang.RuntimeException ist.

// MyCustomKotlinException.kt
package foo

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

Update:
Ich habe den Wurfteil in zwei Zeilen aufgeteilt (Instanzerstellung und -wurf) und habe festgestellt, dass das Problem nicht das Wurf ist. Der try-Block wird nach der Instanzerstellung verlassen. Stimmt irgendetwas nicht mit meiner Instanzerstellung dieser Kotlin-Klasse?

Update2:
Ich habe einen zweiten catch-Block mit Throwable hinzugefügt 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 mit dem Hinzufügen aller Projektdateien zu jar wurde behoben (siehe Antwort unten) . Das Hinzufügen der Kotlin-Laufzeitlib zu gradle funktioniert bei mir nicht.

16
FreshD

Das Hinzufügen aller Projektdateien zum Jar hat das Problem für mich behoben. Ich habe die folgende Zeile zu meinem build.gradle hinzugefügt.

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.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
13
FreshD

Sie müssen Ihr Projekt mit kotlin ..__ konfigurieren. In Android Studio:

  1. klicken Sie auf Extras => Kotlin => Kotlin im Projekt konfigurieren

  2. Dann im Dialog prüfen: Alle Module, die Kotlin-Dateien enthalten

  3. und Version auswählen 

  4. drücke OK

Erledigt.

11
Suraj Vaishnav

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

Prüfen Sie, welches System Sie verwenden, und fügen Sie die erforderliche JAR-Datei hinzu. Sie können überprüfen, ob dies ein Problem ist, indem Sie Ihr Projekt in eine .jar-Datei packen und es mit der Laufzeitbibliothek ausführen.

4
Pelocho

Hatte das gleiche Problem, mein Projekt mit Ant in der Konsole zu kompilieren. Ich habe kotlin-stdlib.jar in classpath eingetragen und das Problem ist verschwunden.

2

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")
}
1
Eng.Fouad

es wird "Intrinsics" in Kotlin auflösen  

füge diese Bibliotheken in der gradle-Datei hinzu

implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.41'
    implementation 'nl.dionsegijn:konfetti:1.1.2'
1
dileep krishnan

In meinem Fall verursachte eine enableFeaturePreview in der Datei settings.gradle dieses Problem bei der Migration zu Kotlin 1.3.

0
matfax