web-dev-qa-db-fra.com

Projet Gradle: Java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

Je travaille sur un projet Java et dans ce projet, j'ai fait mon premier essai avec Kotlin. J'ai commencé à convertir certaines classes en Kotlin avec le convertisseur JavaToKoltin fourni dans Intellij Idea. Entre autres, mes exceptions personnalisées sont maintenant converties en Kotlin. Mais avec cela, la gestion des exceptions ne fonctionne plus correctement.
Si je lance l'une de mes exceptions personnalisées (par exemple, MyCustomKotlinException.kt) dans le code Java, l'exception n'est pas interceptée (voir le code ci-dessous).

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

Alors, quelqu'un peut-il m'expliquer pourquoi l'exception n'est pas attrapée. MyCustomKotlinException hérite de Kotlins RuntimeException, qui est simplement un alias de Java.lang.RuntimeException.

// MyCustomKotlinException.kt
package foo

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

Mettre à jour:
J'ai divisé la partie de projection en 2 lignes (création et lancement d'instance) et constaté que le problème n'était pas le lancement. Le bloc try est laissé après la création de l'instance. Quelque chose ne va pas avec la création de mon instance de cette classe Kotlin?

Update2:
J'ai ajouté un second bloc catch avec Throwable et le Throwable suivant est attrapé.

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

Update3:
Modification du titre pour corriger l'erreur et résolution du problème lié à l'ajout de tous les fichiers du projet à jar (voir réponse ci-dessous) .

16
FreshD

L'ajout de tous les fichiers de projet dans le fichier jar a résolu le problème pour moi. J'ai ajouté la ligne suivante à mon 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.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
13
FreshD

Vous devez configurer votre projet avec kotlin . Donc, dans Android Studio:

  1. cliquer sur Outils => kotlin => Configurer kotlin dans le projet

  2. Ensuite, dans la boîte de dialogue: tous les modules contenant des fichiers kotlin

  3. et sélectionnez la version 

  4. appuyer sur OK

Terminé.

11
Suraj Vaishnav

Je vais dire que vous essayez d'exécuter du code Kotlin sans la bibliothèque kotlin-runtime

Vérifiez le système que vous utilisez et ajoutez le fichier jar nécessaire. Vous pouvez vérifier qu'il s'agit bien de votre problème en compilant votre projet dans un fichier .jar et en l'exécutant avec la bibliothèque runtime

4
Pelocho

Avait le même problème, compiler mon projet avec Ant dans la console. J'ai édité kotlin-stdlib.jar dans classpath et le problème est parti.

2

cela résoudra "Intrinsics" à Kotlin  

ajoute ces bibliothèques dans un fichier gradle

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

Dans mon cas, une enableFeaturePreview dans le fichier settings.gradle est à l'origine de ce problème lors de la migration vers Kotlin 1.3.

0
matfax