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.

0 komentarzy