Pourquoi est-ce que je reçois un NoClassDefFoundError en Java ?

Je reçois un message d'erreur "NoClassDefFoundError" lorsque je lance mon application Java. Quelle est la cause typique de ce problème ?

Bien qu'il soit possible que cela soit dû à une inadéquation des chemins de classe entre le temps de compilation et le temps d'exécution, ce n'est pas nécessairement vrai.

Dans ce cas, il est important de garder en tête deux ou trois exceptions différentes :

  1. java.lang.ClassNotFoundException Cette exception indique que la classe n'a pas été trouvée sur le classpath. Cela indique que nous avons essayé de charger la définition de la classe, et que la classe n'existe pas dans le classpath.

  2. java.lang.NoClassDefFoundError Cette exception indique que la JVM a cherché dans sa structure de données interne de définition de classe la définition d'une classe et ne l'a pas trouvée. C'est différent de dire qu'elle n'a pas pu être chargée depuis le classpath. En général, cela indique que nous avons déjà essayé de charger une classe à partir du classpath, mais que cela a échoué pour une raison ou une autre. Maintenant, nous essayons d&#8217utiliser à nouveau la classe (et devons donc la charger, puisque cela a échoué la dernière fois), mais nous n&#8217essayerons même pas de la charger, parce que nous avons échoué à la charger précédemment (et nous soupçonnons raisonnablement que nous échouerons à nouveau). L'échec précédent pourrait être une ClassNotFoundException ou une ExceptionInInitializerError (indiquant un échec dans le bloc d'initialisation statique) ou tout autre problème. Le fait est qu'une NoClassDefFoundError n'est pas nécessairement un problème de classpath.

Commentaires (12)
Solution

Cela se produit lorsqu'un fichier de classe dont dépend votre code est présent au moment de la compilation mais introuvable au moment de l'exécution. Recherchez les différences entre les chemins de classe au moment de la compilation et au moment de l'exécution.

Commentaires (7)

J'ai constaté que j'obtiens parfois une erreur NoClassDefFound lorsque le code est compilé avec une version incompatible de la classe trouvée au moment de l'exécution. Le cas spécifique dont je me souviens est celui de la bibliothèque apache axis. Il y avait en fait deux versions dans mon classpath d'exécution et la version obsolète et incompatible était sélectionnée au lieu de la version correcte, ce qui provoquait une erreur NoClassDefFound. C'était dans une application en ligne de commande où j'utilisais une commande similaire à celle-ci.

set classpath=%classpath%;axis.jar

J'ai réussi à obtenir la bonne version en utilisant :

set classpath=axis.jar;%classpath%;
Commentaires (2)