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%
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:
- Klasy ładowania wstępnego (bootstrap) platformy Java
- Klasy rozszerzeń np. z folderu ext
- 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ć