Zielony Smok - logo witryny

Co to jest 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. 180. 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ć