java.lang.NoClassDefFoundError aneb kde je ta třída?
Znáte?
java.lang.NoClassDefFoundError: com/bea/netuix/servlets/util/ConcurrentCache$GenerationExceptionKaždý už určitě mnohokrát viděl, snad jen s jiným obsazením herců/tříd. A co s tím? Najít jar-ko, kde se zkompilovaná třída nachází a přidat ho na classpath.
Tendle „trik“ už jsem mnohokrát ukazoval vývojářům, některým i vícekrát. Napříště už je budu odkazovat sem…
find $WL_HOME -type f -name \*jar -exec unzip -l {} \; | egrep '^Archive|ConcurrentCache\$GenerationException'
Co se vlastně děje:
- v adresáři $WL_HOME (zde si doplňte co je zapotřebí, např. /opt/apache-tomcat-5.5.20/)
- hledej všechny soubory jména *.jar,
- vylistuj obsah nalezeného archivu (zde je opravdu nutný parametr -l),
- ve vypsaném obsahu hledej regulární výraz ‘Archive’ od začátku řádky nebo ‘DingsBumsClass’ kdekoliv
- a hop!
...
Archive: /opt/bea/wlserver_10.0/server/lib/consoleapp/webapp/WEB-INF/lib/l10n_taglib.jar
Archive: /opt/bea/wlserver_10.0/server/lib/consoleapp/webapp/WEB-INF/lib/netui-adapter.jar
Archive: /opt/bea/wlserver_10.0/server/lib/consoleapp/webapp/WEB-INF/lib/netuix_common_web.jar
Archive: /opt/bea/wlserver_10.0/server/lib/consoleapp/webapp/WEB-INF/lib/netuix_servlet.jar
913 05-09-07 19:35 com/bea/netuix/servlets/util/ConcurrentCache$GenerationException.class
Archive: /opt/bea/wlserver_10.0/server/lib/consoleapp/webapp/WEB-INF/lib/prefs-spi.jar
Archive: /opt/bea/wlserver_10.0/server/lib/consoleapp/webapp/WEB-INF/lib/render_taglib.jar
Archive: /opt/bea/wlserver_10.0/server/lib/consoleapp/webapp/WEB-INF/lib/standard.jar
...
Budu rád, pokud do komentářů uvedete i jiné možnosti, hlavně pod Windows (ne Cygwin, to dá rozum).
Komentáře
Komentář od podlesh
Datum: 10. 1. 2008, 10:05
To je hezké, ale chybějící jar je jen ten nejjednodušší případ. Horší je když se ukáže, je jar s tou třídou v classpath je. Pak se jedná o problémy s classloaderem, případně selhala inicializace třídy. To už se hledá hůře.
Komentář od Jindra
Datum: 10. 1. 2008, 10:11
Vzhledem k tomu ze se vetsinou hleda ve stale stejny mnozine jaru je podle me lepsi vylistovat obsah vsech jaru do jednoho souboru (napr pres find a unzip -l) a pak uz hledat jenom v danym souboru
Komentář od peto
Datum: 10. 1. 2008, 10:17
ja som si zatial vzdy vystacil s find ./ -type f -name \*jar | xargs grep package/subpackage/Class
nestudoval som vnutornisti zip formatu ale mena suborov su v archivoch zjavne v plaintexte
Komentář od mutable
Datum: 10. 1. 2008, 10:49
Nato sem si kdysi davno udelal skript findclass, trosku zformatuje vystup
#!/bin/bash
if [[ $# -lt 2 ]]; then
echo „Usage: ${0} class {jarFile | directory}…“
exit 1
fi
class=$1
shift
cd „$PWD“
searchJar() {
results=`jar tf „$1″ | grep „/$class.class$“`
if [[ -n "$results" ]]; then
echo „$1″
echo „$results“ | while read c; do
echo -e „\t${c}“;
done
fi
}
for arg in $*; do
if [[ -d "$arg" ]]; then
for jarFile in `find „$arg“ -iname ‘*.jar’`; do
searchJar „$jarFile“
done
else
if [[ "$arg" =~ 'jar$' ]]; then
searchJar „$arg“
fi
fi
done
Komentář od Michal
Datum: 10. 1. 2008, 18:49
A já na to vždy udělám Ctrl + Shit + t v Eclipse, ale ne obráceně…:-)
Komentář od mutable
Datum: 11. 1. 2008, 12:28
sure, ja taky, ale ne vzdy hledam tridu, kterou mam v build path
btw, ja udelam jenom „findclass className“
Komentář od Birkof
Datum: 17. 1. 2008, 18:25
Přesně jako filemon
Na něco jsou některé programy pod Wokna lepší. Ale bez Total Commandera těžko říct, jak bych to dělal. Na druhou stranu, PC s woknama bez Total Commandera snad ani není možný používat.
Komentář od Ondra Zizka
Datum: 19. 1. 2008, 9:40
Doporučuji zkouknout utilitku JPathReport (potažmo i skvělou další – JDiskReport).
Komentář od Petr
Datum: 5. 12. 2008, 13:32
v tomhle co zde píšete se ztrácím, jsem laik a je to pro mě španělská vesnice. nicméně bych potřeboval rozchodit na svém HTC aplikaci LOCIFY nebo HANDYGEOCACHING ale nevim jak na to. a opravdu nerozumim tomu co se tu pise:-( prosim pomohl by mi nekdo??? Dekuju moc za pomoc. jsem na mailu


Komentář od filemon
Datum: 8. 1. 2008, 0:31
Moc pekny, ja na to ve winech pouzivam Total Commander (Alt-F7 + prohledavat archivy). Ale tohle je hezci