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ć

7 komentarzy

  1. Szukam pomocy w związku z konfiguracją zmiennej CLASPATH. Poblem być może wziął się stąd, że wszystko mam zainstalowane na dysku D:, a system na C: (C ma tylko 100GB…). Chciałbym odpalić program w Javie z linii komend i gdy wpisuję javac HelloWorld.java to powstaje plik HelloWorld.class czyli OK, ALE gdy potem wpiszę java HelloWorld to wyskakuje: Error: Could not find or load main class HelloWorld (klasa główna nazywa się tak samo jak plik, tzn. HelloWorld). CLASSPATH mam ustawiony na folder Java\jre1.8.0_221\lib\ext (podobno ta zmienna ma skazywać na jary) oraz na Java\jre1.8.0_221\lib więc gdzie tkwi błąd? Odpowiedzi na to pytanie u wujka Google znaleźć nie mogę…
    Z góry dziękuję za pomoc i pozdrawiam.

    Physicist
    1. Kluczową informacją jest to, czy po uruchomieniu wiersza poleceń i wpisaniu komendy ‘java -version’ otrzymujesz prawidłową informację o zainstalowanym systemie. Jeśli instalowałeś dodatkowo późniejsze JDK problem może tkwić w kolejności wpisów w zmiennej ‘PATH’. Ponadto, jeżeli jakikolwiek *.jar jest umieszczony w jre…/lib/ext jar ten jest automatycznie widziany w systemie i nie ma żadnej potrzeby, a nawet nie wolno umieszczać ścieżki do tego jaru w ‘CLASSPATH’. Ścieżka ‘CLASSPATH’ powinna zaczynać się od ‘.;’ (kropka średnik), żeby wskazać, że poszukiwanie klas powinno zaczynać się od folderu bieżącego, czyli tego gdzie znajdują się uruchamiane pliki *.class. Gdyby twoja klasa korzystała np. z Apache Derby CLASSPATH byłoby tym miejscem, gdzie powinna się znaleźć informacja o plikach *jar tej biblioteki. Jeżeli HelloWorld nie używa takich bibliotek konfiguracja CLASSAPTH nie ma wpływu na twój problem. Następnym pytaniem jest – czy w pliku HelloWorld jest prawidłowa metoda ‘public static void main(String[] args){}’. Podany błąd sugeruje, że to własnie kłopot z tą metodą jest przyczyną. Jeśli tak, czyli metoda main jest prawidłowa to sprawdź czy przekierowując narzędzie ‘java’ i narzędzie ‘javac’ do plików używasz pełnej ściezki. Pełnej, czyli zaczynającej się od C:.

  2. Powiem tak: problem jest wybitnie dziwny bo sprawdziłem wszystkie Twoje porady, tj. po poleceniu java -version pojawia się informacja o wersji (u mnie java version “1.8.0_152”), sprawdziłem polecenia java/javac z pełną ścieżką (choć ja wcześniej z reguły komendami cd wchodziłem do odpowiedniego folderu, a potem używałem poleceń java), z ciekawości dodałem do CLASSPATH ścieżkę ;.\ i dalej to samo… dodam jeszcze, że w pliku HelloWorld.java główna funkcja main zaczyna się tak:
    public static void main(String[] args)
    A co do zmiennej PATH do jest w niej kilka ścieżek i jeżeli ich kolejność ma jakąś rolę to powiem tak: pierwsza odnosi się do *.exe Pythona (w tym języku też ćwiczę), kolejna do folderu z java.exe (jest jeszcze jedna ze ścieżką do java.exe ale w folderze jdk8u, lecz od ok. tygodnia korzystam z najnowszej wersji i ta ścieżka chyba nie ma wpływu na mój problem, racja?). Co więc jeszcze radzisz bo bardzo mnie to gnębi?
    Wielkie dzięki i pozdrawiam

    Physicist
    1. Wczoraj został dodany nowy wpis https://javer.org/jak-sprawdzic-poprawnosc-instalacji-jdk/
      Sprawdź czy twoja instalacja jest poprawna w świetle tego wpisu. Pamiętaj, że CLASSPATH prowadzi do pliku/plików, ale Path prowadzi do folderu. Nazwy folderów są bez slasha na końcu. Jeżeli w Path masz więcej wpisów prowadzących do folderu bin róznych instalacji JDK to tylko pierwsza zostanie uzyta. Pozostałe nigdy uzyte nie będą. Możesz je spokojnie usunąć. Ważne jest czy jest tam ściezka dodana przez Oracle czy nie – piszę o tym we wpisie, który jest wymieniony na poczatku.
      Jesli instalacja jest poprawna to przyczyna musi tkwić w klasie albo w sposobie użycia instrukcji javac.
      Warto tez sprawdzić w systemie operacyjnym na liście zainstalowanych programów jakie JDK lub JRE masz zainstalowane. Do JDK-8 instalowało się 32-bitową wersję JRE dla przegladarek 32-bitowych (aby móc uruchamiac aplety) i wersję 64 bitowa JDK do pozostałych celów. Ta pierwsza była instalowana w ‘Pliki programów (x86)’, Ta druga już w ‘Program Files’.
      Wszystkie odniesienia w PATH powinny byc do JDK nie do JRE.

      1. Znalazłem rozwiązanie mojego problemu (m. in. dzięki Twojemu powyższemu linkowi 😉 ). Otóż mój plik HelloWorld.java (pierwotnie tworzony za pośrednictwe NetBeans’a) znajdował się w katalogu D:Dokumenty\NetBeansProjects\HelloWorld\src\com\Example i zawierał na wstępie instrukcję:
        package com.dzone.example;
        i z niewiadomych przyczyn ta właśnie instrukcja WSZYSTKO psuła… po ujęciu jej w komentarz wszystko działa jak należy 🙂 Zmiennej systemowej JAVA_HOME nie mam i z tego co widzę nie jest ona potrzebna (jest jedynie zmienna Java do folderu jre\bin). Chciałbym bardzo podziękować za niezbędną pomoc! 🙂 Ani wujek Google ani inne forum nie umiało mi pomóc 😛
        Jeszcze raz bardzo dziękuję i pozdrawiam 🙂

        Physicist
        1. W momencie kiedy JDK jest prawidłowo zainstalowane i narzędzia działaja prawidlowo to taki bład musi być w kodzie. Tak że doszlibysmy do tego razem. Ale skoro sam eksperymentowałeś i potrafiłeś sobie poradzić – jesteś materiałem na programistę doskonałego. W razie problemów zapraszam. Zawsze chętnie służę pomocą.

  3. Just want tо say your article is as amazing. The clearness in yoսr post is just cool and
    i could assumе you’re an expert on thіs subject.
    Ꮤell with your permission let mе to grab your feed tօ keep updateԀ ѡith forthcoming post.
    Thanks a million and pⅼease keep up the gratifying work.

Pozostaw odpowiedź Physicist Anuluj pisanie odpowiedzi

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *