Jak poradzić sobie z NoClassDefFoundError
Koziołek
Bardzo często spotykanym na forach problemem jest ten związany z "nagłym" pojawieniem się błędu java.lang.NoClassDefFoundError dotyczącym głównej klasy programu. Zazwyczaj podawana jest też odpowiedź, że należy uruchomić program w taki sposób:
$ java -cp lista_plików_jar NaszaKlasa
W ogólności jest to podejście prawidłowe, ale może wprowadzić w błąd.
Maszyna wirtualna w momencie przekazania jej parametru -cp traktuje go jako nadrzędny w stosunku do wartości domyślnej, czyli ./. Co ważne nie sumuje też wartości domyślnej i przekazanej w parametrze. Powoduje to sytuację, w której do ścieżki przeszukiwania nie należy bieżący katalog. Tym samym wszystkie klasy znajdujące się w nim są pomijane. Należy zatem uruchamiać program podając ścieżkę w następujący sposób:
W systemach z rodziny unix:
$ java -cp ./:lista_plików_jar NaszaKlasa
W przypadku systemów windows:
$ java -cp ./;lista_plików_jar NaszaKlasa
W przypadku cygwina:
$ java -cp ./\;lista_plików_jar NaszaKlasa
W tym też przypadku należy pamiętać, że separatorem nie jest znak ; ale znak ;. Wynika to z faktu, że JVM wymaga jako separatora znaku ; i jednocześnie "nie wie", że pracuje w środowisku emulującym konsolę BASH, gdzie znak ; jest znakiem specjalnym.