Java Language
Klassvägen
Sök…
Introduktion
Anmärkningar
Java-klass laddning
JVM (Java Virtual Machine) laddar klasser som och när klasserna krävs (detta kallas lat-laddning). Platserna för de klasser som ska användas anges på tre platser: -
- De som krävs av Java-plattformen laddas först, till exempel de i Java Class Library och dess beroenden.
- Tilläggsklasser laddas nästa (dvs. de i
jre/lib/ext/
) - Användardefinierade klasser via klassvägen laddas sedan
Klasser laddas med klasser som är subtyper av java.lang.ClassLoader
. Detta beskrivs mer detaljerat i detta ämne: Klasslastare .
Classpath
Klassvägen är en parameter som används av JVM eller kompilatorn som anger platserna för användardefinierade klasser och paket. Detta kan ställas in på kommandoraden som med de flesta av dessa exempel eller genom en miljövariabel ( CLASSPATH
)
Olika sätt att specificera klassvägen
Det finns tre sätt att ställa in klassvägen.
Det kan ställas in med hjälp av
CLASSPATH
:set CLASSPATH=... # Windows and csh export CLASSPATH=... # Unix ksh/bash
Det kan ställas in på kommandoraden på följande sätt
java -classpath ... javac -classpath ...
Observera att
-classpath
(eller-cp
) har företräde framförCLASSPATH
miljövariabeln.Klassvägen för en körbar JAR-fil anges med
Class-Path
elementet iMANIFEST.MF
:Class-Path: jar1-name jar2-name directory-name/jar3-name
Observera att detta endast gäller när JAR-filen körs så här:
java -jar some.jar ...
I detta utföringsläge
-classpath
alternativet-classpath
och miljövariabeln CLASSPATH, även om JAR-filen inte har någotClass-Path
element.
Om ingen klassväg anges är standardklassvägen den valda JAR-filen när du använder java -jar
eller den aktuella katalogen annars.
Relaterad:
- https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
- http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
Lägga till alla JAR i en katalog till klassvägen
Om du vill lägga till alla JAR: er i katalogen till klassvägen, kan du göra detta kortfattat med klassvägssyntax; till exempel:
someFolder/*
Detta berättar för JVM att lägga till alla JAR- och ZIP-filer i someFolder
till klassvägen. Denna syntax kan användas i ett -cp
argument, en CLASSPATH
miljövariabel eller ett Class-Path
attribut i en körbar JAR-fils manifestfil. Se Ställa in Class Path: Class Path Wild Cards för exempel och varningar.
Anmärkningar:
- Classpath-vildkort introducerades först i Java 6. Tidigare versioner av Java behandlar inte "*" som ett jokertecken.
- Du kan inte lägga andra tecken före eller efter " "; t.ex. "someFolder / .jar" är inte ett jokertecken.
- Ett jokertecken matchar bara filer med suffixet ".jar" eller ".JAR". ZIP-filer ignoreras, liksom JAR-filer med olika suffix.
- Ett jokertecken matchar endast JAR-filer i själva katalogen, inte i dess underkataloger.
- När en grupp av JAR-filer matchas med en jokerteckenpost anges inte deras relativa ordning på klassvägen.
Klassvägssyntax
Klassvägen är en sekvens av poster som är katalogvägsnamn, JAR- eller ZIP-filvägsnamn eller JAR / ZIP-jokardspecifikationer.
För en klassväg som anges på kommandoraden (t.ex.
-classpath
) eller som en miljövariabel måste posten separeras med;
(semikolon) tecken på Windows, eller:
(kolon) tecken på andra plattformar (Linux, UNIX, MacOSX och så vidare).För
Class-Path
elementet i en JAR-filsMANIFEST.MF
, använd ett enda utrymme för att skilja uppgifterna.
Ibland är det nödvändigt att bädda in ett utrymme i en klassvägspost
När klassvägen anges på kommandoraden handlar det helt enkelt om att använda rätt skalcitering. Till exempel:
export CLASSPATH="/home/user/My JAR Files/foo.jar:second.jar"
(Detaljerna kan bero på kommandoskalet som du använder.)
När klassvägen anges i en JAR-fil är en "MANIFEST.MF" -fil, måste URL-kodning användas.
Class-Path: /home/user/My%20JAR%20Files/foo.jar second.jar
Dynamisk klassväg
Ibland räcker det bara med att lägga till alla JAR från en mapp, till exempel när du har en inbyggd kod och behöver välja en delmängd av JAR. I det här fallet behöver du två huvudmetoder main()
. Den första bygger en klasslastare och använder sedan denna klasslastare för att ringa den andra huvudmenyn main()
.
Här är ett exempel som väljer rätt SWT native JAR för din plattform, lägger till alla applikationens JAR och påkallar sedan den verkliga main()
: Skapa plattform Java SWT Application
Ladda en resurs från klassvägen
Det kan vara användbart att ladda en resurs (bild, textfil, egenskaper, KeyStore, ...) som är förpackad i en JAR. För detta ändamål kan vi använda Class
och ClassLoader
.
Anta att vi har följande projektstruktur:
program.jar
|
\-com
\-project
|
|-file.txt
\-Test.class
Och vi vill komma åt innehållet i file.txt
från Test
. Vi kan göra det genom att fråga klasslastaren:
InputStream is = Test.class.getClassLoader().getResourceAsStream("com/project/file.txt");
Genom att använda klasslastaren måste vi ange den fullt kvalificerade sökvägen för vår resurs (varje paket).
Eller alternativt kan vi fråga Testklassobjektet direkt
InputStream is = Test.class.getResourceAsStream("file.txt");
Med hjälp av klassobjektet är banan relativt klassen själv. Vår Test.class
är i com.project
paketet, samma som file.txt
, vi behöver inte specificera någon sökväg alls.
Vi kan dock använda absoluta vägar från klassobjektet, så:
is = Test.class.getResourceAsStream("/com/project/file.txt");
Kartlägga klassnamn till sökväg
Vanliga Java-verktygskedjor (och verktyg från tredje part som utformats för att samverka med dem) har specifika regler för att kartlägga namnen på klasser till sökvägarna för filer och andra resurser som representerar dem.
Kartläggningarna är följande
- För klasser i standardpaketet är sökvägarna enkla filnamn.
- För klasser i ett namngivet paket kartlägger paketnamnets komponenter till kataloger.
- För namngivna kapslade och inre klasser formas filnamnkomponenten genom att förena klassnamnen med ett
$
-tecken. - För anonyma inre klasser används siffror istället för namn.
Detta illustreras i följande tabell:
Klassnamn | Källvägsnamn | Classfile söknamn |
---|---|---|
SomeClass | SomeClass.java | SomeClass.class |
com.example.SomeClass | com/example/SomeClass.java | com/example/SomeClass.class |
SomeClass.Inner | (i SomeClass.java ) | SomeClass$Inner.class |
SomeClass anon inre klasser | (i SomeClass.java ) | SomeClass$1.class , SomeClass$2.class osv |
Vad klassvägen betyder: hur sökningar fungerar
Syftet med klassvägen är att berätta för en JVM var man kan hitta klasser och andra resurser. Betydelsen av klassvägen och sökprocessen sammanflätas.
Klassvägen är en form av sökväg som anger en sekvens av platser att leta efter resurser. I en standardklassväg är dessa platser antingen, en katalog i värdfilsystemet, en JAR-fil eller en ZIP-fil. I båda fallen är platsen roten till ett namnutrymme som kommer att sökas.
Standardförfarandet för att söka efter en klass på klassvägen är följande:
Karta klassnamnet till ett relativt klassfilvägsnamn
RP
. Kartläggningen för klassnamn till klassens filnamn beskrivs på annat håll.För varje post
E
i klassvägen:- Om posten är en filsystemkatalog:
- Lös
RP
relativtE
att ge ett absolut söknamnAP
. - Testa om
AP
är en sökväg för en befintlig fil. - Om ja, ladda klassen från den filen
- Lös
- Om posten är en JAR- eller ZIP-fil:
- Sök
RP
i JAR / ZIP-filindex. - Om motsvarande JAR / ZIP-filpost finns, laddar du klassen från den posten.
- Sök
- Om posten är en filsystemkatalog:
Proceduren för att söka efter en resurs på klassvägen beror på om resursvägen är absolut eller relativ. För en absolut resursväg är proceduren som ovan. För en relativ Class.getResource
löses med Class.getResource
eller Class.getResourceAsStream
banan för klasserpaketet före sökning.
(Observera att det här är procedurerna som implementeras av standard Java-klasslastare. En anpassad klasslastare kan utföra sökningen annorlunda.)
Klasssteget för bootstrap
De normala Java-klasslastarna letar först efter klasser i bootstrap-klassvägen, innan de kontrollerar för tillägg och programklassens sökväg. Som standard består bootstrap-klassvägen av filen "rt.jar" och några andra viktiga JAR-filer som tillhandahålls av JRE-installationen. Dessa tillhandahåller alla klasser i standardbiblioteket för Java SE-klass, tillsammans med olika "interna" implementeringsklasser.
Under normala omständigheter behöver du inte bekymra dig om detta. Som standard kommer kommandon som java
, javac
och så vidare att använda lämpliga versioner av runtime-biblioteken.
Mycket ibland är det nödvändigt att åsidosätta Java-körtidens normala beteende genom att använda en alternativ version av en klass i standardbiblioteken. Du kan till exempel stöta på ett "show stopper" -fel i runtime-biblioteken som du inte kan arbeta med på normalt sätt. I en sådan situation är det möjligt att skapa en JAR-fil som innehåller den förändrade klassen och sedan lägga till den till bootstrap-klassvägen som startar JVM.
java
kommandot innehåller följande -X
alternativ för att modifiera bootstrap-klassvägen:
-
-Xbootclasspath:<path>
ersätter den aktuella startklassklassvägen med sökvägen. -
-Xbootclasspath/a:<path>
lägger till den angivna sökvägen till den aktuella startklassen. -
-Xbootclasspath/p:<path>
beror på den angivna sökvägen till den aktuella startklassen.
Observera att när du använder alternativen för bootclasspath för att ersätta eller åsidosätta en Java-klass (etcetera), så ändrar du tekniskt Java. Det kan ha licenspåverkan om du sedan distribuerar din kod. (Se villkoren för Java Binary License ... och konsultera en advokat.)