Sök…


Introduktion

Klassvägen visar platser där Java-runtime ska leta efter klasser och resurser. Klassvägen används också av Java-kompilatorn för att hitta tidigare sammanställda och externa beroenden.

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: -

  1. De som krävs av Java-plattformen laddas först, till exempel de i Java Class Library och dess beroenden.
  2. Tilläggsklasser laddas nästa (dvs. de i jre/lib/ext/ )
  3. 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.

  1. Det kan ställas in med hjälp av CLASSPATH :

     set CLASSPATH=...         # Windows and csh
     export CLASSPATH=...      # Unix ksh/bash
    
  2. 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ör CLASSPATH miljövariabeln.

  3. Klassvägen för en körbar JAR-fil anges med Class-Path elementet i MANIFEST.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ågot Class-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:

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:

  1. Classpath-vildkort introducerades först i Java 6. Tidigare versioner av Java behandlar inte "*" som ett jokertecken.
  2. Du kan inte lägga andra tecken före eller efter " "; t.ex. "someFolder / .jar" är inte ett jokertecken.
  3. Ett jokertecken matchar bara filer med suffixet ".jar" eller ".JAR". ZIP-filer ignoreras, liksom JAR-filer med olika suffix.
  4. Ett jokertecken matchar endast JAR-filer i själva katalogen, inte i dess underkataloger.
  5. 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-fils MANIFEST.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:

  1. Karta klassnamnet till ett relativt klassfilvägsnamn RP . Kartläggningen för klassnamn till klassens filnamn beskrivs på annat håll.

  2. För varje post E i klassvägen:

    • Om posten är en filsystemkatalog:
      • Lös RP relativt E att ge ett absolut söknamn AP .
      • Testa om AP är en sökväg för en befintlig fil.
      • Om ja, ladda klassen från den filen
    • 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.

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.)



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow