Java Language
Ścieżka klas
Szukaj…
Wprowadzenie
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:
- Najpierw ładowane są te wymagane przez platformę Java, takie jak te w bibliotece klas Java i jej zależnościach.
- Klasy rozszerzeń są ładowane w następnej
jre/lib/ext/
(tj. Wjre/lib/ext/
) - 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.
Można go ustawić za pomocą zmiennej środowiskowej
CLASSPATH
:set CLASSPATH=... # Windows and csh export CLASSPATH=... # Unix ksh/bash
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
.Ścieżka klasy wykonywalnego pliku JAR jest określana za pomocą elementu
Class-Path
w plikuMANIFEST.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 elementuClass-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:
- https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
- http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
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:
- Symbole wieloznaczne Classpath zostały po raz pierwszy wprowadzone w Javie 6. Wcześniejsze wersje Java nie traktują „*” jako symbolu wieloznacznego.
- Nie możesz wstawiać innych znaków przed lub po „ ”; np. „someFolder / .jar” nie jest znakiem wieloznacznym.
- Symbol wieloznaczny pasuje tylko do plików z sufiksem „.jar” lub „.JAR”. Pliki ZIP są ignorowane, podobnie jak pliki JAR z różnymi przyrostkami.
- Symbol wieloznaczny pasuje tylko do plików JAR w samym katalogu, a nie w jego podkatalogach.
- 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 JARMANIFEST.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:
Odwzoruj nazwę klasy na względną nazwę ścieżki pliku
RP
. Odwzorowanie nazw klas na nazwy plików klas opisano w innym miejscu.Dla każdego wpisu
E
w ścieżce klasy:- Jeśli pozycja jest katalogiem systemu plików:
- Rozwiąż
RP
względemE
aby podać bezwzględną nazwę ścieżkiAP
. - Sprawdź, czy
AP
jest ścieżką do istniejącego pliku. - Jeśli tak, załaduj klasę z tego pliku
- Rozwiąż
- 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.
- Wyszukaj
- Jeśli pozycja jest katalogiem systemu plików:
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.)