Szukaj…


Wprowadzenie

Ścieżka klasy zawiera listę miejsc, w których środowisko wykonawcze Java powinno szukać klas i zasobów. Ścieżka klasy jest także używana przez kompilator Java do wyszukiwania wcześniej skompilowanych i zewnętrznych zależności.

Uwagi

Ładowanie klasy Java

JVM (wirtualna maszyna Java) ładuje klasy, gdy i kiedy klasy są wymagane (nazywa się to ładowaniem opóźnionym). Lokalizacje klas, które mają być użyte, określono w trzech miejscach:

  1. Najpierw ładowane są te wymagane przez platformę Java, takie jak te w bibliotece klas Java i jej zależnościach.
  2. Klasy rozszerzeń są ładowane w następnej jre/lib/ext/ (tj. W jre/lib/ext/ )
  3. Klasy zdefiniowane przez użytkownika za pomocą ścieżki klasy są następnie ładowane

Klasy są ładowane przy użyciu klas, które są podtypami java.lang.ClassLoader . Opisano to bardziej szczegółowo w tym temacie : Classloaders .

Ścieżka klasy

Ścieżka klasy jest parametrem używanym przez JVM lub kompilator, który określa położenia klas i pakietów zdefiniowanych przez użytkownika. Można to ustawić w wierszu polecenia, jak w większości tych przykładów lub za pomocą zmiennej środowiskowej ( CLASSPATH )

Różne sposoby określania ścieżki klasy

Istnieją trzy sposoby ustawienia ścieżki klas.

  1. Można go ustawić za pomocą zmiennej środowiskowej CLASSPATH :

     set CLASSPATH=...         # Windows and csh
     export CLASSPATH=...      # Unix ksh/bash
    
  2. Można go ustawić w wierszu poleceń w następujący sposób

     java -classpath ...
     javac -classpath ...
    

    Zauważ, że opcja -classpath (lub -cp ) ma pierwszeństwo przed zmienną środowiskową CLASSPATH .

  3. Ścieżka klasy wykonywalnego pliku JAR jest określana za pomocą elementu Class-Path w pliku MANIFEST.MF :

     Class-Path: jar1-name jar2-name directory-name/jar3-name
    

    Uwaga: dotyczy to tylko sytuacji, gdy plik JAR jest wykonywany w następujący sposób:

     java -jar some.jar ...
    

    W tym trybie wykonywania opcja -classpath i zmienna środowiskowa CLASSPATH zostaną zignorowane, nawet jeśli plik JAR nie ma elementu Class-Path .

Jeśli nie określono ścieżki klasy, domyślną ścieżką klasy jest wybrany plik JAR, jeśli używany jest java -jar , lub w innym przypadku bieżący katalog.

Związane z:

Dodanie wszystkich plików JAR z katalogu do ścieżki klasy

Jeśli chcesz dodać wszystkie pliki JAR w katalogu do ścieżki klasy, możesz to zrobić zwięźle, używając składni wieloznacznej classpath; na przykład:

 someFolder/*

Mówi to JVM o dodaniu wszystkich plików JAR i ZIP z katalogu someFolder do ścieżki klasy. Tej składni można użyć w argumencie -cp , zmiennej środowiskowej CLASSPATH lub atrybucie Class-Path w pliku manifestu pliku wykonywalnego JAR. Zobacz przykłady i ostrzeżenia Ustawianie ścieżki klasy: Symbole wieloznaczne ścieżki klasy .

Uwagi:

  1. Symbole wieloznaczne Classpath zostały po raz pierwszy wprowadzone w Javie 6. Wcześniejsze wersje Java nie traktują „*” jako symbolu wieloznacznego.
  2. Nie możesz wstawiać innych znaków przed lub po „ ”; np. „someFolder / .jar” nie jest znakiem wieloznacznym.
  3. Symbol wieloznaczny pasuje tylko do plików z sufiksem „.jar” lub „.JAR”. Pliki ZIP są ignorowane, podobnie jak pliki JAR z różnymi przyrostkami.
  4. Symbol wieloznaczny pasuje tylko do plików JAR w samym katalogu, a nie w jego podkatalogach.
  5. Gdy grupie plików JAR pasuje wpis wieloznaczny, ich względna kolejność w ścieżce klasy nie jest określona.

Składnia ścieżki klasy

Ścieżka klasy jest sekwencją wpisów, które są ścieżkami do katalogów, ścieżkami do plików JAR lub ZIP lub specyfikacjami symboli wieloznacznych JAR / ZIP.

  • W przypadku ścieżki klasy określonej w wierszu komend (np. -classpath ) lub jako zmienna środowiskowa wpisy muszą być oddzielone ; (średnik) znaki w systemie Windows lub : (dwukropek) znaki na innych platformach (Linux, UNIX, MacOSX itd.).

  • W przypadku elementu Class-Path w pliku JAR MANIFEST.MF użyj pojedynczej spacji, aby oddzielić wpisy.

Czasami konieczne jest osadzenie spacji we wpisie ścieżki klasy

  • Kiedy ścieżka klasy jest podana w wierszu poleceń, wystarczy po prostu użyć odpowiedniego cytowania powłoki. Na przykład:

    export CLASSPATH="/home/user/My JAR Files/foo.jar:second.jar"
    

    (Szczegóły mogą zależeć od używanej powłoki poleceń).

  • Gdy ścieżka klasy jest określona w pliku JAR jako plik „MANIFEST.MF”, należy zastosować kodowanie URL.

     Class-Path: /home/user/My%20JAR%20Files/foo.jar second.jar
    

Dynamiczna ścieżka klasy

Czasami samo dodanie wszystkich plików JAR z folderu nie wystarcza, na przykład, gdy masz natywny kod i musisz wybrać podzbiór plików JAR. W takim przypadku potrzebujesz dwóch main() metod. Pierwszy buduje moduł ładujący, a następnie używa tego modułu wywołującego drugi moduł main() .

Oto przykład, który wybiera właściwy rodzimy plik JAR SWT dla platformy, dodaje wszystkie pliki JAR aplikacji, a następnie wywołuje prawdziwą metodę main() : Utwórz wieloplatformową aplikację Java SWT

Załaduj zasób ze ścieżki klas

Przydatne może być załadowanie zasobu (obrazu, pliku tekstowego, właściwości, magazynu kluczy, ...) spakowanego w pliku JAR. W tym celu możemy użyć Class i ClassLoader .

Załóżmy, że mamy następującą strukturę projektu:

program.jar
|
\-com
  \-project
    |
    |-file.txt
    \-Test.class  

I chcemy uzyskać dostęp do zawartości file.txt z klasy Test . Możemy to zrobić, pytając moduł ładujący:

InputStream is = Test.class.getClassLoader().getResourceAsStream("com/project/file.txt");

Korzystając z modułu ładującego klasy, musimy określić w pełni kwalifikowaną ścieżkę naszego zasobu (każdego pakietu).

Lub alternatywnie możemy zapytać bezpośrednio obiekt klasy Test

InputStream is = Test.class.getResourceAsStream("file.txt");

Za pomocą obiektu klasy ścieżka jest względna do samej klasy. Nasza Test.class znajduje się w pakiecie com.project , tak samo jak file.txt , w ogóle nie musimy określać żadnej ścieżki.

Możemy jednak użyć ścieżek bezwzględnych z obiektu klasy, w następujący sposób:

 is = Test.class.getResourceAsStream("/com/project/file.txt");

Mapowanie nazw klas do nazw ścieżek

Standardowy zestaw narzędzi Java (i narzędzia innych firm zaprojektowane do współpracy z nimi) mają określone reguły mapowania nazw klas na ścieżki plików i innych zasobów, które je reprezentują.

Odwzorowania są następujące

  • W przypadku klas w pakiecie domyślnym nazwy ścieżek są prostymi nazwami plików.
  • W przypadku klas w nazwanym pakiecie komponenty nazwy pakietu są mapowane na katalogi.
  • W nazwanych klasach zagnieżdżonych i wewnętrznych komponent nazwy pliku jest tworzony przez połączenie nazw klas znakiem $ .
  • W przypadku anonimowych klas wewnętrznych numery są używane zamiast nazw.

Ilustruje to poniższa tabela:

Nazwa klasy Nazwa ścieżki źródłowej Nazwa pliku klasy
SomeClass SomeClass.java SomeClass.class
com.example.SomeClass com/example/SomeClass.java com/example/SomeClass.class
SomeClass.Inner (w SomeClass.java ) SomeClass$Inner.class
SomeClass klasy wewnętrzne SomeClass (w SomeClass.java ) SomeClass$1.class , SomeClass$2.class itp

Co oznacza ścieżka klas: jak działają wyszukiwania

Celem ścieżki klas jest przekazanie JVM informacji o tym, gdzie znaleźć klasy i inne zasoby. Znaczenie ścieżki klas i procesu wyszukiwania są ze sobą powiązane.

Ścieżka klasy jest formą ścieżki wyszukiwania, która określa sekwencję lokalizacji w poszukiwaniu zasobów. W standardowej ścieżce klas tymi miejscami są katalog w systemie plików hosta, plik JAR lub plik ZIP. W każdym przypadku lokalizacja jest głównym obszarem nazw, który będzie przeszukiwany.

Standardowa procedura wyszukiwania klasy na ścieżce klasy jest następująca:

  1. Odwzoruj nazwę klasy na względną nazwę ścieżki pliku RP . Odwzorowanie nazw klas na nazwy plików klas opisano w innym miejscu.

  2. Dla każdego wpisu E w ścieżce klasy:

    • Jeśli pozycja jest katalogiem systemu plików:
      • Rozwiąż RP względem E aby podać bezwzględną nazwę ścieżki AP .
      • Sprawdź, czy AP jest ścieżką do istniejącego pliku.
      • Jeśli tak, załaduj klasę z tego pliku
    • Jeśli wpis jest plikiem JAR lub ZIP:
      • Wyszukaj RP w indeksie plików JAR / ZIP.
      • Jeśli istnieje odpowiedni wpis pliku JAR / ZIP, załaduj klasę z tego wpisu.

Procedura wyszukiwania zasobu w ścieżce klas zależy od tego, czy ścieżka zasobu jest bezwzględna, czy względna. W przypadku bezwzględnej ścieżki zasobów procedura jest taka jak powyżej. W przypadku względnej ścieżki zasobów rozwiązanej za pomocą Class.getResource lub Class.getResourceAsStream ścieżka do pakietu klas jest poprzedzana przed wyszukiwaniem.

(Uwaga: są to procedury zaimplementowane przez standardowe moduły ładujące klasy Java. Niestandardowy moduł ładujący klasy może wykonywać wyszukiwanie inaczej).

Ścieżka klasy bootstrap

Normalne moduły ładujące klasy Java najpierw szukają klas w ścieżce klasy bootstrap, a następnie sprawdzają rozszerzenia i ścieżkę klasy aplikacji. Domyślnie ścieżka klasy bootstrap składa się z pliku „rt.jar” i innych ważnych plików JAR, które są dostarczane przez instalację JRE. Zapewniają one wszystkie klasy w standardowej bibliotece klas Java SE, a także różne „wewnętrzne” klasy implementacji.

W normalnych okolicznościach nie musisz się tym przejmować. Domyślnie polecenia takie jak java , javac i tak dalej używają odpowiednich wersji bibliotek środowiska wykonawczego.

Bardzo rzadko konieczne jest zastąpienie normalnego działania środowiska wykonawczego Java za pomocą alternatywnej wersji klasy w bibliotekach standardowych. Na przykład możesz napotkać błąd „pokaż stoper” w bibliotekach wykonawczych, którego nie można obejść w normalny sposób. W takiej sytuacji możliwe jest utworzenie pliku JAR zawierającego zmienioną klasę, a następnie dodanie go do ścieżki klas bootstrap, która uruchamia JVM.

Komenda java udostępnia następujące opcje -X do modyfikowania ścieżki klasy bootstrap:

  • -Xbootclasspath:<path> zastępuje bieżącą ścieżkę klasy rozruchu podaną ścieżką.
  • -Xbootclasspath/a:<path> dołącza podaną ścieżkę do bieżącej ścieżki klas rozruchu.
  • -Xbootclasspath/p:<path> przygotowuje podaną ścieżkę do bieżącej ścieżki klasy rozruchu.

Zauważ, że kiedy używasz opcji bootclasspath do zastąpienia lub zastąpienia klasy Java (itp.), Technicznie modyfikujesz Javę. Jeśli następnie rozpowszechnisz swój kod, mogą wystąpić konsekwencje związane z licencją. (Zapoznaj się z warunkami licencji binarnej Java ... i skonsultuj się z prawnikiem.)



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow