java.lang.NoClassDefFoundError aneb kde je ta třída?

Václav Sýkora | 7. 1. 2008 | Obecné | , | Přečteno: 7,343

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).

Sdílení:
  • Facebook
  • Google Bookmarks
  • Linkuj.cz

Komentáře

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 ;)

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