Perché ricevo un NoClassDefFoundError in Java?

Sto ottenendo un NoClassDefFoundError quando eseguo la mia applicazione Java. Qual è tipicamente la causa di questo?

Mentre è possibile che questo sia dovuto ad un errore di classpath tra il tempo di compilazione e il tempo di esecuzione, non è necessariamente vero.

In questo caso è importante mantenere due o tre eccezioni diverse nella nostra testa:

  1. java.lang.ClassNotFoundException Questa eccezione indica che la classe non è stata trovata nel classpath. Questo indica che stavamo cercando di caricare la definizione della classe e la classe non esisteva nel classpath.

  2. java.lang.NoClassDefFoundError Questa eccezione indica che la JVM ha cercato la definizione di una classe nella sua struttura dati interna e non l'ha trovata. Questo è diverso dal dire che non può essere caricata dal classpath. Di solito questo indica che abbiamo precedentemente tentato di caricare una classe dal classpath, ma è fallito per qualche motivo - ora stiamo cercando di usare di nuovo la classe (e quindi abbiamo bisogno di caricarla, dato che è fallito l'ultima volta), ma non abbiamo nemmeno intenzione di provare a caricarla, perché abbiamo fallito a caricarla in precedenza (e ragionevolmente sospettiamo che falliremo di nuovo). Il fallimento precedente potrebbe essere una ClassNotFoundException o un ExceptionInInitializerError (che indica un fallimento nel blocco di inizializzazione statica) o qualsiasi altro problema. Il punto è che un NoClassDefFoundError non è necessariamente un problema di classpath.

Commentari (12)
Soluzione

Questo è causato quando c'è un file di classe da cui dipende il vostro codice ed è presente in fase di compilazione ma non viene trovato in fase di esecuzione. Cercate le differenze nei vostri classpath di compilazione e di runtime.

Commentari (7)

Ho scoperto che a volte ottengo un errore NoClassDefFound quando il codice viene compilato con una versione incompatibile della classe trovata a runtime. Il caso specifico che ricordo è con la libreria apache axis. C'erano effettivamente 2 versioni nel mio classpath di runtime e stava raccogliendo la versione non aggiornata e incompatibile e non quella corretta, causando un errore NoClassDefFound. Questo era in un'applicazione a riga di comando dove stavo usando un comando simile a questo.

set classpath=%classpath%;axis.jar

Sono riuscito a fargli prendere la versione corretta usando:

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