Waarom krijg ik een NoClassDefFoundError in Java?

Ik krijg een NoClassDefFoundError als ik mijn Java applicatie draai. Wat is typisch de oorzaak hiervan?

Hoewel het mogelijk is dat dit te wijten is aan een classpath mismatch tussen compileertijd en runstijd, is het niet noodzakelijk waar.

Het is belangrijk om in dit geval twee of drie verschillende uitzonderingen recht in ons hoofd te houden:

  1. java.lang.ClassNotFoundException Deze exceptie geeft aan dat de klasse niet gevonden is op het classpath. Dit geeft aan dat we de class definitie probeerden te laden, en dat de class niet bestond op het classpath.

  2. java.lang.NoClassDefFoundError Deze uitzondering geeft aan dat de JVM in zijn interne klasse definitie datastructuur heeft gezocht naar de definitie van een klasse en deze niet heeft gevonden. Dit is iets anders dan zeggen dat de class niet van het classpath geladen kon worden. Gewoonlijk geeft dit aan dat we eerder probeerden een klasse van het classpath te laden, maar dat dit om een of andere reden mislukte - nu proberen we de klasse opnieuw te gebruiken (en dus moeten we ze laden, aangezien het de vorige keer mislukte), maar we'gaan zelfs niet proberen ze te laden, omdat het laden eerder mislukte (en redelijkerwijs vermoeden dat we opnieuw zouden mislukken). De eerdere mislukking zou een ClassNotFoundException of een ExceptionInInitializerError (die een mislukking in het statische initialisatieblok aangeeft) of een willekeurig aantal andere problemen kunnen zijn. Het punt is dat een NoClassDefFoundError niet noodzakelijk een classpath probleem is.

Commentaren (12)
Oplossing

Dit wordt veroorzaakt wanneer er een klassebestand is waar je code van afhangt en het wel aanwezig is tijdens het compileren, maar niet gevonden wordt tijdens runtime. Zoek naar verschillen in de classpaths tijdens het compileren en tijdens het runtimen.

Commentaren (7)

Ik heb gemerkt dat ik soms een NoClassDefFound foutmelding krijg wanneer code wordt gecompileerd met een incompatibele versie van de class die tijdens runtime wordt gevonden. Het specifieke geval dat ik me herinner is met de apache axis library. Er waren eigenlijk 2 versies op mijn runtime classpath en het pikte de verouderde en incompatibele versie op en niet de juiste, wat een NoClassDefFound fout veroorzaakte. Dit was in een command line app waar ik een commando gebruikte dat hier op leek.

set classpath=%classpath%;axis.jar

Ik was in staat om het de juiste versie te laten ophalen door gebruik te maken van:

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