NoClassDefFoundError - Eclipse et Android

193

J'ai un problème en essayant d'exécuter une application Android qui, jusqu'à l'ajout d'une deuxième bibliothèque externe à son chemin de construction, fonctionnait bien. Depuis que j'ai ajouté le pot scoreninja, j'obtiens maintenant un NoClassDefFoundError lorsque j'essaie d'exécuter l'application.

Voici le message:

02-11 21:45:26.154: ERROR/AndroidRuntime(3654): java.lang.NoClassDefFoundError: com.scoreninja.adapter.ScoreNinjaAdapter

Comme tous les scripts de génération sont générés par les outils Android (?), Je ne sais pas quoi faire d'autre que le nettoyage et la reconstruction ou le redémarrage d'Eclipse (j'ai déjà essayé les trois). Est-ce que quelqu'un sait comment je peux modifier cela?

Tom R
la source
1
Comment avez-vous ajouté le fichier jar? Avez-vous ajouté en utilisant le chemin de génération -> Bibliothèques -> Bocaux externes ??
Teja Kantamneni
1
Projet avec le bouton droit de la souris> Créer un chemin> Ajouter des archives externes ... selon les instructions ici: scoreninja.appspot.com
Tom R
4
Si vous avez mis à jour ADT récemment, regardez la réponse de John ci-dessous (et votez!) Stackoverflow.com/a/9916751/489852
Atul Goyal
1
Si vous rencontrez ce problème, avant de passer directement à la réponse de John, la réponse de @Till ci-dessous le résout également pour beaucoup de gens, moi y compris.
Carlos P
Avez-vous essayé le multidex?
Ashish Rawat

Réponses:

234

J'ai eu ce problème après la mise à jour d'ADT.

Je stockais tous mes fichiers JAR dans un dossier appelé "lib" et j'ajoutais les fichiers JAR au chemin de génération de la manière Eclipse normale. Cela a bien fonctionné jusqu'à ma mise à jour.

Après ma mise à jour, j'obtenais le NoClassDefFoundError pour une classe que je pouvais clairement voir était incluse dans le pot (en vérifiant les classes ReferencedLibraries).

La solution était de supprimer mes pots du chemin de compilation et de renommer mon dossier "lib" en "libs". Il s'agit d'une convention de fourmi, et semble être la façon dont le nouvel ADT trouve et inclut les bibliothèques dans un fichier .apk. Une fois que j'ai fait cela, tout a bien fonctionné.

John O'Connor
la source
1
Merci beaucoup! Je n'avais ni lib ni dossier libs avant la mise à jour ADT d'hier, et tout fonctionnait bien. Après la mise à jour, tous les pots externes ont eu ce problème. Ils ont été corrigés grâce à votre réponse. Je dois combiner le vôtre avec celui de Brian pour le faire fonctionner.
Hong
Merci John! J'ajouterai qu'après avoir changé de dossier en libs j'ai dû redémarrer eclipse pour que ça marche.
Michaeldcooney
5
J'ai rencontré le même problème après la mise à jour d'ADT, mais je gardais mes fichiers JAR dans un répertoire en dehors de mon projet et je les incluais en tant que bibliothèque utilisateur dans mon chemin de génération. La solution était de supprimer la bibliothèque utilisateur de mon chemin de génération et d'inclure à la place des fichiers jar en utilisant "Ajouter des fichiers jars externes", puis de les exporter en cochant les cases de l'onglet "Commander et exporter".
Travis
1
Je faisais référence à android-support-v13.jar en tant que bibliothèque externe dans C: \ android-sdk-windows \ extras \ android \ compatibilité \ v13. J'ai déplacé ce fichier JAR dans le dossier libs du projet et supprimé la référence de Java Build Path -> Libraries. Une construction propre et je repartais.
Snowwire
Salut. J'ai essayé notre approche en ajoutant les bibliothèques externes du pot dans / libs et maintenant je reçois cette erreur: La conversion au format Dalvik a échoué avec l'erreur 1
Jonathan
100

Je n'ai pas eu à mettre la bibliothèque de pots dans des actifs ou des bibliothèques, mais je ne coche que la case de ce pot dans Propriétés -> Chemin de construction Java -> "Ordonner et exporter" (elle était répertoriée avant, mais non sélectionnée) )

Jusqu'à
la source
Merci beaucoup! Cela faisait longtemps que je luttais contre cette erreur et tout ce que je devais faire était de cocher la case sacrée du pot dans l'écran "Commander et exporter". Le plus drôle, c'est que je n'avais qu'à le faire pour qu'il fonctionne sur un émulateur Nook Tablet. N'a pas eu de problème sur les appareils ou autres émulateurs.
Luis
5
Est-ce que quelqu'un sait pourquoi vous devez faire les deux, ajouter la bibliothèque et également cocher la case Commander et exporter? Y a-t-il une raison pour laquelle je voudrais ajouter un JAR externe mais ne pas l'inclure dans la commande et l'exportation?
Lou Morda
J'ai eu ce problème après la mise à jour d'ADT et cela l'a résolu pour moi.
cdavidyoung
5
Cela m'a aidé, mais seulement après avoir fait Project -> Clean
altumano
Merci!! M'a sauvé. J'ai dû faire un nettoyage et redémarrer après l'installation d'Eclipse Juno.
Rynardt
68

En ajoutant le pot externe dans votre chemin de build, vous ajoutez simplement le pot à votre package, mais il ne sera pas disponible pendant l'exécution.

Pour que le pot soit disponible au moment de l' exécution , vous devez:

  • Mettez le pot sous votre assetsdossier
  • Incluez cette copie du pot dans votre chemin de construction
  • Accédez à l'onglet d'exportation dans la même fenêtre contextuelle
  • Cochez la case par rapport au pot nouvellement ajouté
Anthony Forloney
la source
ScoreNinjaAdapter est le code de quelqu'un d'autre, mais je serais très surpris s'il contenait une telle erreur car elle est couramment utilisée. L'erreur se produit à un moment donné dans mon propre code.
Tom R
L'erreur se produit littéralement ici: sna = new ScoreNinjaAdapter (this, SN_APP_ID, SN_APP_KEY);
Tom R
Avez-vous besoin d'une importdéclaration pour les fichiers jar externes? Je ne les ai jamais utilisés.
Anthony Forloney
Avez-vous essayé de supprimer le fichier .jar de l' assestsapproche par dossier?
Anthony Forloney
Ouais. Au final, j'en ai eu assez de tout cela et j'ai juste téléchargé la source et copié les fichiers source dans mon projet. Ce n'est pas la meilleure solution, mais cela fonctionne maintenant. Merci pour votre aide.
Tom R
48

J'avais ceci pour MapActivity. Builds dans Eclipse obtient NoClassDefFound dans le débogueur.

Vous avez oublié d'ajouter la bibliothèque au manifeste, à l'intérieur de l' <Application>...</Application>élément

<uses-library android:name="com.google.android.maps" />
brian.clear
la source
27

J'ai changé l'ordre des projets inclus (Eclipse / Configure Build Path / Order and Export). J'ai déplacé mes deux projets dépendants en haut de la liste "Commander et exporter". Il a résolu le problème "NoClassDefFoundError".

C'est étrange pour moi. Je n'ai pas entendu parler de l'importance de l'ordre des bibliothèques et des projets inclus. Android + Eclipse est amusant :)

Andrew Krizhanovsky
la source
C'est également la solution mentionnée par le deuxième commentaire ici dans le bugruport: code.google.com/p/android/issues/detail?id=55304
arberg
15

Je ne sais pas si cela est lié, ou si vous cherchez même une réponse, mais je suis tombé sur ce fil en essayant de rechercher la même erreur (mais peut-être pour différentes raisons).

Je n'ai trouvé aucune solution en ligne, mais une réponse sur un sujet similaire m'a fait réfléchir et m'a rendu compte que je devais probablement juste reconstruire (ou nettoyer) le projet.

Dans Eclipse, accédez à Projet => Nettoyer. Sélectionnez votre projet et Eclipse a semblé le réparer lui-même. Pour moi, cela a résolu le problème.

J'espère que cela t'aides.

Brian
la source
Oui, il semble y avoir un bogue dans Eclipse / ADT / dex / quoi que ce soit qui manque essentiellement des classes dans la construction. Il peut également manquer la Applicationclasse, ce qui entraîne une erreur différente.
Timmmm
13

J'ai rencontré le même problème. La raison en était que la bibliothèque que j'essayais d'utiliser avait été compilée avec un JDK 7 standard.

Je l'ai recompilé avec les -source 1.6 -target 1.6options et cela a bien fonctionné.

assylias
la source
MERCI YOUUUUUUUUUUUUUUU !!!!!!!!!!!!!!!!!!! J'ai été frustré par ce problème et vous l'avez résolu! Il est un peu ironique que même le dernier SDK Jelly Bean 4.3 (API 18) ne puisse toujours pas lire 1.7 JAR / classes. Et le pire de tout, il ne se plaint pas du tout :(
Hendy Irawan
J'avais le même problème. Le pire de tous, c'est que j'ai pensé à cette option, puis j'ai changé ma -source 1.7 avec -source 1.5 (pour être sûr) et le problème n'a pas été résolu. Mais, après avoir lu votre commentaire, j'ai réessayé avec 1.6 puis ça a fonctionné comme un charme.
Pedro Náñez
7

La même chose a fonctionné pour moi: Propriétés -> Java Build Path -> "Order and Export" Fait intéressant - pourquoi cela ne se fait pas automatiquement? Je suppose que certains paramètres sont manquants. Cela m'est également arrivé après la mise à niveau du SDK.

Vlad
la source
3

Cliquez avec le bouton droit sur votre dossier de projet, recherchez Propriétés dans le chemin de génération Java et sélectionnez les fichiers jar que vous voyez. ça a marché pour moi.

zacharia
la source
2

J'ai tout essayé depuis ce post (et quelques autres), et cela n'a pas fonctionné pour moi, c'est de loin la mise à niveau ADT la plus terrible que j'ai connue, et je ne mettrai jamais à niveau sans une sauvegarde ADT fonctionnelle.

J'ai réussi à le résoudre en supprimant le projet, puis en l'ajoutant à nouveau à l'aide d'une sauvegarde source que j'avais.

Eli
la source
2

J'ai eu cette même erreur avec ADT22. Résolution de la vérification des "bibliothèques privées Android" dans les propriétés -> Chemin de génération Java -> Commande et exportation. Si vous utilisez des projets de bibliothèque, la même chose devrait également être faite pour eux.

prijupaul
la source
Cela a également fonctionné pour moi. J'ai inclus la bibliothèque mais j'ai oublié de la vérifier dans "Commander et exporter". Je vous remercie!
jmrodrigg
2

Toutes les réponses existantes ne fonctionnent pas pour moi car mon cas est un peu différent. Il m'a fallu quelques heures pour le faire fonctionner. J'utilise Eclipse.

Mon projet Android comprend un autre projet Java 1.6 normal, qui nécessite un fichier jar tiers. L'astuce est:

  • inclure le bocal dans le projet java normal pour qu'il soit compilé (uniquement), ne le cochez pas dans l'onglet "Commander et exporter"
  • copiez également ce fichier jar dans le dossier "libs" du projet android afin qu'il soit disponible en runtime

J'espère que cela aidera ceux qui ont des scénarios similaires comme le mien.

Pouce d'or
la source
1

il faut parfois prendre tout le projet externe comme bibliothèque et pas seulement le pot:

mon problème a été résolu en ajoutant tout le projet (dans mon cas, google-play-services_lib) comme bibliothèque et pas seulement le pot. les étapes pour y arriver (de la réponse @style ):

  1. Fichier-> Nouveau-> Autre
  2. Sélectionnez un projet Android
  3. Sélectionnez "Créer un projet à partir d'une source existante"
  4. Cliquez sur le bouton "Parcourir ..." et accédez au projet souhaité
  5. Terminer (maintenant le projet de barre d'actions dans votre espace de travail)
  6. Faites un clic droit sur votre projet -> Propriétés
  7. Dans la section Android-> Bibliothèque, cliquez sur Ajouter
  8. sélectionnez le projet récemment ajouté -> Ok
dvrm
la source
1

Parfois, cela se produira en raison de l'absence de jar, dont vous avez la dépendance, avec la balise "uses-libary" dans votre AndroidManifest.xml.

Assurez-vous également qu'il doit se trouver dans la balise "application".

Cordialement,

Ravi

Ravi Pandit
la source
1

J'ai eu ce problème et il a été causé par le fait de ne pas "exporter" la bibliothèque. Le problème vient simplement du fait que les fichiers .class pour certaines classes ne sont pas disponibles lors de l'empaquetage de l'APK. Le temps de compilation fonctionnera correctement sans exporimentation

Dans mon cas, j'utilisais la classe "CusrsorAdapter" et sous "JavaBuildPath-> Order and Export", je n'ai pas vérifié le support V4. Une fois sélectionné, le problème a disparu.

Pour vous assurer que vous obtenez une erreur noClassDefFound pour la raison ci-dessus, veuillez vérifier votre logacat, vous verrez une erreur de super classes inconnue au moment de l'exécution.

Sojan PR
la source
0

J'ai essayé différentes choses et la raison de l'erreur dans mon cas était un conflit entre maps.jar et Google Api dans Java Build Path-> Libraries. Donc, quand j'ai supprimé le maps.jar, cela a bien fonctionné.

Cordialement,

wahib

Wahib Ul Haq
la source
0

veuillez vous assurer que votre fichier jar se trouve dans le répertoire libs de votre projet car vous utilisez une version ADT plus récente avec votre éclipse.

samir
la source
0

J'ai exactement le même problème ... Pour le corriger, je viens de supprimer mes bibliothèques privées Android dans "chemin de génération" et j'ai cliqué sur ok ... et quand j'ai ouvert op le "chemin de génération" à nouveau, eclipse les avait à nouveau ajoutées par lui-même, et puis ça a marché pour moi;) ...

pkdkk
la source
0

j'ai passé deux jours à essayer de résoudre ce problème après la mise à jour d'ADT. enfin j'ai eu la chance d'avoir ce post ici:

https://code.google.com/p/android/issues/detail?id=55304

ce qui m'a conduit dans la bonne direction. lorsque vous suivez la solution - n'oubliez pas de remplacer la bibliothèque de support Android de tous vos projets par la même version (supprimez-la et réinstallez-la dans les projets). j'espère que cela aide - bonne chance

Ron
la source
0

Si vous préférez savoir à quels fichiers la solution de contournement est liée, voici ce que j'ai trouvé. Changez simplement le fichier .classpath en

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

Remplacez le fichier .classpath dans tous les projets de bibliothèque et dans le projet Android principal. Le fichier .classpath se trouve dans le dossier racine du projet eclipse. N'oubliez pas d'ajouter vos propres entrées de chemin de classe, si vous en avez (comparez donc avec votre version actuelle de .classpath).

Je crois que c'est le même résultat que de parcourir les menus d'éclipse comme l'explique l'utilisateur du composant ci-dessus (Eclipse / Configurer le chemin de construction / Commander et exporter).

arberg
la source
0

La solution ici a fonctionné pour moi. Il s'agit d'importer la bibliothèque dans le dossier libs, puis de modifier le fichier build.gradle puis de nettoyer avec gradlew.

gabr10
la source
0

Si vous modifiez votre commande et exportez dans le chemin de génération de votre projet, cette erreur ne se produira pas. L'autre façon d'y parvenir est via .classpath dans votre dossier de projet.

geekgugi
la source
0

Essaye ça:-

Étape 1

Ajouter toutes les bibliothèques pour construire pat dans Eclipse (signifie que toutes les bibliothèques référencées sont des bibliothèques)

Étape 2

Supprimez le fichier R.java et générez à nouveau le projet. Ne vous inquiétez pas, R.java sera automatiquement recréé.

Chill :)

user1606195
la source
0

Si j'ai bien compris, votre projet ne montre aucune erreur, car vous avez inclus le pot. Mais le Jar ne sera pas utilisé lorsque votre projet sera "exporté" vers l'appareil. Essaye ça

Projet -> Propriétés

Java Build Path / Order and Export

[✔] Votre pot


la source
0

Cela m'arrive très souvent.

La dernière fois que je me suis souvenu, cela a été causé par le basculement de l'Eclipse ADT (édition spéciale de Google) vers Android Studio et le retour. J'ai essentiellement essayé toutes les méthodes que je peux trouver sur stackoverflow qui ne fonctionnaient pas pour moi.

Finalement, j'ai fait fonctionner l'application à nouveau (plus de NoCalssDeffoundError) en passant mon IDE à Eclipse d'origine (Kepler) avec ADT.

tyolab
la source