Java FAQ

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 <samp>java.lang.NoClassDefFoundError</samp> 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 <samp>-cp</samp> traktuje go jako nadrzędny w stosunku do wartości domyślnej, czyli <samp>./</samp>. 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 <samp>;</samp> ale znak <samp>\;</samp>. Wynika to z faktu, że JVM wymaga jako separatora znaku <samp>;</samp> i jednocześnie "nie wie", że pracuje w środowisku emulującym konsolę BASH, gdzie znak <samp>;</samp> jest znakiem specjalnym.

FAQ

0 komentarzy