Java » Czyli często zadawane pytania

Jak poradzić sobie z NoClassDefFoundError

  • 2013-04-18 12:32
  • 0 komentarzy
  • 1151 odsłon
  • Oceń ten tekst jako pierwszy
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.