CLASSPATH

CLASSPATH (ang. ścieżka klas) to zmienna systemowa Windows zawierającą ścieżkę dostępu do klas Java (oraz innych zasobów) użytkownika niezbędnych dla np. aplikacji uruchamianych z linii poleceń. Poszczególne ścieżki są oddzielane średnikiem ;.
Kropka .; umieszczona w zmiennej wskazuje, że poszukiwanie klas powinno zacząć się od folderu bieżącego. Jeżeli w zmiennej CLASSPATH znajduje się jedynie .; (wartość domyślna) – oznacza to, że jedynie folder bieżący zostanie przeszukany.
Aby określić wartość zmiennej CLASSPATH z linii poleceń używamy polecenia:
echo %CLASSPATH%

Co to jest CLASSPATH
Rys. 170. Polecenie echo dla zmiennej CLASSPATH

Jeżeli jako wynik zobaczymy powtórzone %CLASSPATH% oznacza, to że takiej zmiennej nie ma.
Zmienną CLASSPATH możemy dodać, usunąć albo zmienić jej zawartość dokładnie tak samo jak w zmiennej PATH (Co to jest ‘PATH’?).

Ustawianie ścieżki

W wierszu poleceń:
set CLASSPATH=path1:path2
Ścieżki powinny zaczynać się od litery dysku. Można też używać ścieżek względnych zaczynających się od \ ale to może prowadzić do nieporozumień.
Przed znakiem i po znaku= w set CLASSPATH= nie może być spacji.

Kasowanie ścieżki

W wierszu poleceń:
set CLASSPATH=
Ta komenda kasuje ścieżkę dla danego okna wiersza poleceń.

Ścieżka domyślna

Domyślną ścieżką klas jest katalog bieżący .; Ustawienie set CLASSPATH nadpisuje .;, czyli jeśli ten zapis jest konieczny, powinien być powtórzony przy ustawianiu zmiennej

-cp albo -classpath albo – -class-path

-cp albo -classpath albo --class-path to przełącznik używany w narzędziach JDK uruchamianych z linii poleceń wskazujący położenie klas Java (i innych zasobów) użytkownika. Przełącznik pozwala na ustawienie odrębnej ścieżki klas dla każdej aplikacji.
Poszczególne ścieżki oddzielone są znakiem : dwukropka.

Ścieżka domyślna

Domyślną ścieżką klas jest katalog bieżący .;. Ustawienie --class-path nadpisuje .;, czyli jeśli ten zapis jest konieczny, powinien być powtórzony przy ustawianiu zmiennej.

Dokąd prowadzi ścieżka

  • plik archiwum JAR zawierający klasy – ścieżka kończy się nazwą pliku nazwa.jar
  • plik archiwum ZIP zawierający klasy – ścieżka kończy się nazwa pliku nazwa.zip
  • pliki klas w nie nazwanym pakiecie (tylko Java 8) – ścieżka kończy się nazwą folderu zawierającego pliki klas
  • pliki klas w pakiecie – ścieżka kończy się nazwą pakietu głównego (root)
  • ścieżka nigdy nie kończy się plikiem klasa.class

Znaki uniwersalne

  • pliki *jar albo *.zip w folderze – ścieżka kończy się nazwa_folderu/* (nie trzeba wymieniać plików pojedynczo
  • Ustawienie z * nie prowadzi do klas zawartych w folderze nazwa_folderu
    Aby wymienić wszystkie pliki archiwów oraz klasy ‘luzem’ należy użyć składni:
    nazwa_folderu:nazwa_folderu/* albo
    nazwa_folderu/*:nazwa_folderu
    Podfoldery w folderach nie są rekurencyjnie przeszukiwane i powinny być enumeratywnie
    wymienione.
    Pliki archiwów w folderze są wyszukiwane i przeglądane w zmiennej kolejności!
    Znaki uniwersalne nie mogą być stosowane w plikach manifestu umieszczanych w plikach
    archiwów.
    Dokumentacja Oracle podkreśla, że nazwa pakietu jest związana z nazwą klasy.
    W sytuacji gdy w folderze C:\java\MyClasses znajduje się pakiet np. z skompilowaną klasą:
    utility.myapp.Cool to w narzędziu java wpisujemy:
    java -classpath C:\java\MyClasses utility.myapp.Cool
    To prowadzi do wniosku, że klasy z tego samego pakietu mogą znajdować się w różnych
    folderach.
    W przypadku, gdy opisana klasa znajdzie się w pliku archiwum myclasses.jar to ścieżka powinna być zapisana jako:
    java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool

    Co ma być na ścieżce?

    Wszystkie klasy, które były potrzebne w czasie kompilacji.
    Kolejność ścieżek jest ważna. Java przeszukuje klas w folderach w tej kolejności w jakiej
    zostały wymienione w ścieżce klas. Jeżeli znajdzie potrzebną klasę kończy przeszukiwanie.
    Kolejność ładowania klas:

    1. Klasy ładowania wstępnego (bootstrap) platformy Java
    2. Klasy rozszerzeń np. z folderu ext
    3. Klasy użytkownika umieszczone w ścieżce klas

    Uwaga!

    Standardowe biblioteki występujące w JDK i JRE w folderach /lib oraz folderach /ext sa automatycznie widoczne w systemie i nie wymagaja umieszczania informacji o nich w ścieżce CLASSPATH.
    Od Java 9, zgodnie z zasadami modularyzacji (powiem o tym wkrótce):

    • klasy muszą być umieszczone w pakiecie nazwanym
    • nazwy pakietów umieszczonych w ścieżce klas nie mogą się powtarzać