web-dev-qa-db-fra.com

Erreur "NoClassDefFoundError: Impossible d'initialiser la classe"

Lorsque je lance mon projet, je reçois de nombreux résultats de cette erreur:

Org.Apache.catalina.core.StandardWrapperValve invoke 
 SEVERE: Servlet.service () pour le servlet Jersey a lancé une exception 
 Java.lang.NoClassDefFoundError: Impossible d'initialiser classe SpringFactory 
 at com.point2.prospect.persistence.hibernate.HibernateTransactionInterceptor.doFilter (HibernateTrans 
 actionInterceptor.Java:17)
 à org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.Java:235) 
 à org.Apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.Java:206) 
 à l'adresse com.point2.prospect.restapi.ServerErrorInterceptor.doFilter (ServerErrorInterceptor.Java:27) 
 à org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.Java:235) 
 à org.Apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.Java:206) 
 à org.Apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.Java:233) 
 à org.Apache.catalina.core.StandardContextValve.invoke (StandardContextValve.Java:191) 
 à org.Apache.catalina.core.StandardHostValve.invoke (StandardHostValve.Java:128) 
 à org.Apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.Java:102) 
 à org.Apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.Java:109) 
 à org.Apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.Java:286) 
 à org.Apache.coyote.http11.Http11Processor.process (Http11Processor.Java:845) 
 à org.Apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process (Http11Protocol.Java:583) 
 à org.Apache.Tomcat.util.net.JIoEndpoint $ Worker.run (JIoEndpoint.Java:447) 
 à Java.lang.Thread.run (Thread.Java:619) 

Je remarque que ce problème a tendance à être posé partout sur le Web, mais sans réelle réponse. Quelle est la cause générale de ce type d'erreur?

67
bm

L'erreur NoClassDefFound est une erreur nébuleuse et cache souvent un problème plus grave. C'est pas la même chose que ClassNotFoundException (qui est levée quand la classe est tout simplement pas là).

NoClassDefFound may indique que la classe n’est pas présente, comme l’indiquent les javadocs, mais elle est généralement levée lorsque, après que le chargeur de classes a chargé les octets de la classe et y appelle "defineClass". Vérifiez également soigneusement votre trace de pile complète pour d’autres indices ou d’éventuelles "causes" (bien que votre trace particulière ne montre rien).

Le premier endroit à regarder lorsque vous obtenez une erreur NoClassDefFoundError se trouve dans les bits statiques de votre classe, c’est-à-dire toute initialisation qui a lieu pendant la définition de la classe. Si cela échoue, une erreur NoClassDefFoundError est générée. Elle est supposée générer une exception ExceptionInInitializerError et indiquer les détails du problème, mais dans mon expérience, ils sont rares. Il ne créera d'exceptionInInitializerError que la première fois qu'il tente de définir la classe, après quoi il lancera simplement NoClassDefFound. Alors, regardez les journaux précédents.

Je suggérerais donc de regarder le code dans cette ligne HibernateTransactionInterceptor et de voir ce dont il a besoin. Il semble qu'il ne soit pas en mesure de définir la classe SpringFactory. Alors peut-être vérifier le code d'initialisation dans cette classe, cela pourrait aider. Si vous pouvez le déboguer, arrêtez-le à la dernière ligne au-dessus de (17) et procédez au débogage afin de pouvoir rechercher la ligne exacte à l'origine de l'exception. Vérifiez également plus haut dans le journal, si vous êtes très chanceux, il pourrait y avoir une exception ExceptionInInitializerError.

182
Michael Wiles

Vous manquez la définition de classe nécessaire; généralement causé par le fait que le fichier JAR requis n'est pas dans classpath.

De API J2SE :

classe publique NoClassDefFoundError étend LinkageError

Lancé si la machine virtuelle Java ou une instance de ClassLoader tente de charger dans la définition d'une classe (en tant que partie d'un appel de méthode normale ou en tant que partie de créant une nouvelle instance à l'aide de la nouvelle expression ) et aucune définition du la classe pourrait être trouvée.

La définition de classe recherchée existait lors de l'exécution en cours La classe a été compilée, mais la définition ne peut plus être trouvé.

6
ChssPly76

J'avais rencontré le même problème, car la bibliothèque jar avait été copiée par un autre utilisateur Linux (root) et que l'utilisateur connecté (processus) ne disposait pas des privilèges suffisants pour lire le contenu du fichier jar.

0
Kayvan Tehrani

J'ai eu ceci:

 class Util {
  static boolean isNeverAsync = System.getenv().get("asyncc_exclude_redundancy").equals("yes");
}

vous pouvez probablement voir le problème, la variable env peut renvoyer null au lieu de chaîne . Donc, juste pour tester ma théorie, je l'ai changée en:

 class Util {
  static boolean isNeverAsync = false;
}

et le problème est parti. Dommage que Java ne puisse pas vous donner la trace exacte de la pile de l'erreur, un peu bizarre.

0
MrCholo