Proyecto Gradle: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

7 minutos de lectura

Avatar de usuario de FreshD
fresco

Estoy trabajando en un proyecto de Java y dentro de este proyecto hice mi primer intento con Kotlin. Comencé a convertir algunas clases a Kotlin con el convertidor JavaToKoltin provisto en Intellij Idea. Entre otras, mis excepciones personalizadas ahora se convierten a Kotlin. Pero con esto, el manejo de excepciones ya no funciona correctamente.
Si lanzo una de mis excepciones personalizadas (p. ej. MyCustomKotlinException.kt) dentro del código Java, la excepción no se captura (ver el código a continuación).

// 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 ...
        }
    }
}

Entonces, ¿alguien puede explicarme por qué la excepción no es atrapada? MyCustomKotlinException está heredando de Kotlins RuntimeExceptionque es solo un alias para java.lang.RuntimeException.

// MyCustomKotlinException.kt
package foo

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

Actualizar:

Dividí la parte de lanzamiento en 2 líneas (creación de instancia y lanzamiento) y descubrí que el problema no es el lanzamiento. El bloque de prueba se deja después de la creación de la instancia. ¿Hay algún problema con la creación de mi instancia de esta clase de Kotlin?

Actualización2:

Agregué un segundo bloque catch con Throwable y se atrapa el siguiente Throwable.

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

Actualización3:

Cambió el título para corregir el error y solucionó el problema al agregar todos los archivos del proyecto al contenedor (consulte la respuesta a continuación). Agregar la biblioteca de tiempo de ejecución de Kotlin a gradle no funciona para mí.

  • Proporcione un ejemplo reproducible mínimo completo, por ejemplo, con ese código fuente de kotlin.

    – Gato fantasma

    26 de mayo de 2017 a las 8:59

  • @GhostCat ¿es esto suficiente para ti?

    – FreshD

    26 de mayo de 2017 a las 9:13

  • Tiene que ser suficiente para que la gente pueda reproducir el problema. Parece que ahora.

    – Gato fantasma

    26 de mayo de 2017 a las 9:14

  • @FreshD No puedo reproducir el problema con el código que proporcionó.

    – Christian Bruggemann

    26 mayo 2017 a las 11:50

  • @Christian Sí, tienes razón. Acabo de probar con este ejemplo y funciona. Pero la clase de excepción se ve igual, pero con un nombre diferente y también la creación de la instancia en la captura de prueba es la misma, así que no tengo idea de por qué funciona solo para el ejemplo.

    – FreshD

    26 de mayo de 2017 a las 12:01


Avatar de usuario de FreshD
fresco

Agregar todos los archivos del proyecto al contenedor me solucionó el problema. Agregué la siguiente línea a mi 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) } }
}

Actualizar: Cambió configurations.compile.collect a configurations.compileClasspath.collect de acuerdo con esta respuesta a continuación.

  • Usar configurations.compileClasspath ahora en lugar de configurations.compile como @ simon-o mencionado anteriormente.

    – Chris

    16 de febrero de 2020 a las 19:27

  • ¿Podrías, por favor, darme un paso a paso de cómo generaste el JAR de tu proyecto? estoy teniendo grandes problemas con eso

    –Bruno Azevedo

    12 de septiembre de 2020 a las 1:14

  • ¿Cómo hago esto? build.gradle.kts?

    – reparando3

    15 de febrero de 2021 a las 6:45

  • @mending3 ¿Qué sucede si agrega las líneas anteriores en build.gradle.kts?

    – FreshD

    15 de febrero de 2021 a las 11:23

Avatar de usuario de Suraj Vaishnav
Suraj Vaishnav

Necesitas configurar tu proyecto con kotlin. Así que en Android Studio:

  1. haga clic en Herramientas => kotlin => Configurar kotlin en el proyecto

  2. Luego, en la verificación de diálogo: Todos los módulos que contienen archivos kotlin

  3. y seleccione la versión

  4. presiona OK

Hecho.

Es probable que este error se deba al hecho de que la tarea jar simple no toma todas sus dependencias de tiempo de ejecución.

De documentación gradleEn tus build.gradle.kts puede crear una tarea “fatJar” o agregarla a su tarea 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) }
    })
}

  • Gracias, cuando encontré la excepción de 【es un duplicado pero no se ha establecido una estrategia de manejo de duplicados】, agregué 【duplicatesStrategy = DuplicatesStrategy.EXCLUDE】 y estuvo bien

    – Lancer.Yan

    15 de junio a las 4:43

Voy a decir que está tratando de ejecutar el código Kotlin sin el kotlin-runtime biblioteca

Compruebe qué sistema está utilizando y agregue el archivo jar necesario. Puede verificar que este es su problema empaquetando su proyecto en un .jar archivo y ejecutarlo con el Biblioteca de ejecución

Avatar de usuario de Simon O
Simón O.

Gracias por el comentario. Por cierto compile es obsoleto. Sin embargo, la respuesta aceptada no funciona con implementation. Así que busqué el configuración del complemento de la biblioteca java y implementation depende de compileClasspath.

Así que mi solución por ahora es agregar

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

con

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

Siento que esto debería hacerlo el complemento org.jetbrains.kotlin.jvm.

Usando compile en vez de implementation en las dependencias del archivo build.gradle me lo resolvió.

  • implementation es más nuevo que compile. No debe usarse en reemplazo

    –Kishita Variya

    30 de octubre de 2019 a las 11:48

  • @Kishita Gracias por tu comentario. Tienes toda la razón y compilar no debería usarse más. Estaba buscando una mejor alternativa y actualicé mi respuesta.

    – Simón O.

    31 oct 2019 a las 15:35

  • Ah, y por cierto, la razón por la que no puede usar settings.implementation.collect o settings.api.collect es que no se pueden resolver.

    – Simón O.

    31 oct 2019 a las 15:37

Avatar de usuario de DmitryKanunnikoff
DmitryKanunnikoff

Tuve el mismo problema al compilar mi proyecto con Ant en la consola. He agregado kotlin-stdlib.jar en classpath y el problema desapareció.

  • implementation es más nuevo que compile. No debe usarse en reemplazo

    –Kishita Variya

    30 de octubre de 2019 a las 11:48

  • @Kishita Gracias por tu comentario. Tienes toda la razón y compilar no debería usarse más. Estaba buscando una mejor alternativa y actualicé mi respuesta.

    – Simón O.

    31 oct 2019 a las 15:35

  • Ah, y por cierto, la razón por la que no puede usar settings.implementation.collect o settings.api.collect es que no se pueden resolver.

    – Simón O.

    31 oct 2019 a las 15:37

Avatar de usuario de Eng.Fouad
Ing. Fouad

Agregar lo siguiente resolvió el problema para mí:

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

Aquí está el contenido de 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

El completo gradle.build.kts (configuración fuera de línea):

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

¿Ha sido útil esta solución?