Erreur «NoClassDefFoundError: impossible d’initialiser la classe»

Lorsque je lance mon projet, j’obtiens de nombreux résultats de cette erreur:

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

Je remarque que ce problème a tendance à se poser sur tout le Web, mais sans réelle réponse. Quelle est la cause générale de ce type d’erreur?

L’erreur NoClassDefFound est une erreur nébuleuse et cache souvent un problème plus grave. Ce n’est pas la même chose que ClassNotFoundException (qui est lancé lorsque la classe est tout simplement pas là).

NoClassDefFound peut indiquer que la classe n’est pas présente, comme l’indiquent les javadocs, mais elle est généralement renvoyée lorsque le chargeur de classe a chargé les octets de la classe et appelle “defineClass” sur ces classes. Vérifiez également attentivement votre trace complète de la stack pour d’autres indices ou les éventuelles «causes» d’exceptions (bien que votre trace particulière ne montre aucune trace).

Le premier endroit où vous obtenez un object NoClassDefFoundError se trouve dans les bits statiques de votre classe, c’est-à-dire toute initialisation effectuée lors de la définition de la classe. Si cela échoue, il lancera une erreur NoClassDefFoundError – il est supposé lancer une erreur ExceptionInInitializerError et indiquer les détails du problème mais, selon mon expérience, ces problèmes sont rares. Il ne fera qu’ExceptionInInitializerError la première fois qu’il essaiera de définir la classe, après quoi il lancera simplement NoClassDefFound. Donc, 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 soit impossible 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 (17) et déboguez-le pour que vous puissiez essayer de trouver la ligne exacte à l’origine de l’exception. Vérifiez également plus haut dans le journal, si vous avez beaucoup de chance, il pourrait y avoir une exception ExceptionInInitializerError.

Vous manquez la définition de classe nécessaire; généralement causé par le JAR requirejs n’étant pas dans classpath.

De l’ API J2SE :

la classe publique NoClassDefFoundError étend LinkageError

Émis si la machine virtuelle Java ou une instance ClassLoader tente de charger dans la définition d’une classe (dans le cadre d’un appel de méthode normal ou dans le cadre de la création d’une nouvelle instance à l’aide de la nouvelle expression) et aucune définition de la classe n’a pu être trouvée.

La définition de classe recherchée existait lorsque la classe en cours d’exécution était compilée, mais la définition ne peut plus être trouvée.

J’avais rencontré le même problème, car la bibliothèque jar avait été copiée par un autre utilisateur Linux (root), et l’utilisateur connecté (process) n’avait pas suffisamment de privilèges pour lire le contenu du fichier jar.

Réalisé que j’utilisais OpenJDK quand j’ai vu cette erreur. Correction du problème une fois que j’ai installé Oracle JDK à la place.