JAVA

Java – uruchamianie programu z classpath (WIN XP)

Dodano: 2008-09-25
Pisząc program w języku java i używając zewnętrzynch klas (*.class) oraz paczek (*.jre, *.jdk), napewno spotkałeś się z problemem, że gdy kompilujesz program w edytorze javy to aplikacja działa poprawnie, natomiast gdy chcesz uruchomić ją poza edytorem pojawia się komunikat NoClassDefFoundError.

Problem tkwi w tym, że maszyna wirtualna nie wie skąd ma pobrać zewnętrzne klasy i/lub paczki. Tutaj wkracza classpath. Załóżmy, że masz plik programu myclass.class oraz plik klasy zewnętrznej strangeclass.jar, oraz pliki znajdują się w tym samym katalogu.

Poinformować maszynę wirtualną możesz o tym na cztery sposoby:

  • 1) Kompilator zadbał o to sam – lub musisz mu w tym trochę pomóc (zależy co używasz :–).
  • 2) Poprosisz ładnie maszynę wirtualną javy o uwzględnienie własnych klas, rzadko jednak jest skłonna wysłuchać próśb kodera ;–(
  • 3) Uruchom program z linii komend uwzględniając ścieżkę do klas lub/i paczek.
  • 4) Skorzystasz z pliku manifest dla plików z rozszerzeniem *.jar.
  • 5) Istnieje jeszcze kilka sposobów wskazania ścieżki do zewnętrznych klas i/lub paczek. Warto się nimi zainteresować. Nie ma to jak strona java.sun.com.


Rozwinę teraz, może punkt 3 i 4, resztę punktów rozwiń sam – nie ma łatwo w życiu.
  • ad3) Użyj komendy (cmd):
    java –cp .;strangeclass.jar myclass
  • ad4) Teraz zajmiemy się plikiem myclass.jar, utworzyć go możesz za pomocą kompilatora lub własnymi siłami. Pliki *.jar to spakowane archiwa *.zip, dlatego żeby było je łatwiej przesyłać przez Internet ;–)
    Zamień rozszerzenie *.jar na *.zip, przejdź do myclass\META–INF\ zedytuj plik MANIFEST.MF , może wyglądać następująco po zmianach (pamiętaj, że ostatnia linia pliku musi zostać pusta – wystarczy jedna linia ;–):

    Manifest–Version: 1.0
    Ant–Version: Apache Ant 1.7.0
    Created–By: 1.6.0_02–b05 (Sun Microsystems Inc.)
    Main–Class: myclass.main
    Class–Path: strangeclass.jar


cytat: Jak się za długo zmagasz z jakimś problemem – idź na spacer!