Perché ricevo un NoClassDefFoundError in Java?
Sto ottenendo un NoClassDefFoundError
quando eseguo la mia applicazione Java. Qual è tipicamente la causa di questo?
502
3
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:
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.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.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.
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.
Sono riuscito a fargli prendere la versione corretta usando: