Bei Verwendung von Java 6 oder höher unterstützt die Option classpath Wildcards. Beachten Sie das Folgende:
- Verwenden Sie gerade Anführungszeichen (
"
)
- Verwenden Sie
*
, nicht *.jar
Windows
java -cp "Test.jar;lib/*" my.package.MainClass
Unix
java -cp "Test.jar:lib/*" my.package.MainClass
Dies ist ähnlich wie bei Windows, verwendet aber :
代わりに ;
. Wenn Sie keine Platzhalter verwenden können, bash
erlaubt die folgende Syntax (wobei lib
ist das Verzeichnis, das alle Java-Archivdateien enthält):
java -cp "$(printf %s: lib/*.jar)"
(Beachten Sie, dass die Verwendung eines Klassenpfads nicht mit dem -jar
Option. Siehe auch: Jar-Datei mit mehreren Klassenpfadbibliotheken von der Eingabeaufforderung aus ausführen )
Verstehen von Platzhaltern
De la Klassenpfad Dokument:
Klassenpfadeinträge können das Platzhalterzeichen für den Basisnamen enthalten *
was gleichbedeutend mit der Angabe einer Liste aller Dateien ist in dem Verzeichnis mit der Erweiterung .jar
o .JAR
. Zum Beispiel kann der Klassenpfad-Eintrag foo/*
spezifiziert alle JAR-Dateien in dem Verzeichnis foo. Ein Klassenpfadeintrag, der einfach aus *
erweitert sich zu einer Liste mit allen der jar-Dateien im aktuellen Verzeichnis.
Ein Klassenpfadeintrag, der Folgendes enthält *
passt nicht zu Klassendateien. Um sowohl Klassen als auch JAR-Dateien in einem einzigen Verzeichnis foo abzugleichen, verwenden Sie entweder foo;foo/*
o foo/*;foo
. Die gewählte Reihenfolge bestimmt, ob die Klassen und Ressourcen in foo
werden vor JAR-Dateien in foo
, oder andersherum.
Unterverzeichnisse werden nicht rekursiv durchsucht. Zum Beispiel, foo/*
siehe nach JAR-Dateien nur in foo
, nicht in foo/bar
, foo/baz
etc.
Die Reihenfolge, in der die JAR-Dateien in einem Verzeichnis im erweiterten Klassenpfad aufgezählt werden erweiterten Klassenpfad aufgezählt werden, ist nicht festgelegt und kann von Plattform zu Plattform und sogar von Moment zu Moment auf demselben Rechner variieren. A gut konstruierte Anwendung sollte nicht von einer bestimmten Reihenfolge abhängen. Wenn eine bestimmte Reihenfolge erforderlich ist, können die JAR-Dateien explizit im Klassenpfad aufgezählt werden.
Die Expansion von Platzhaltern erfolgt früh, vor dem Aufruf einer der Hauptmethode eines Programms und nicht erst während des Ladens der Klasse Prozess selbst. Jedes Element des Eingabeklassenpfads, das einen Wildcard enthält, wird durch die (möglicherweise leere) Folge von Elementen ersetzt, die durch Aufzählung der JAR-Dateien im benannten Verzeichnis erzeugt wird. Für zum Beispiel, wenn das Verzeichnis foo
enthält a.jar
, b.jar
y c.jar
dann der Klassenpfad foo/*
wird erweitert zu foo/a.jar;foo/b.jar;foo/c.jar
, und diese Zeichenkette wäre der Wert der Systemeigenschaft java.class.path
.
El CLASSPATH
wird nicht anders behandelt als die Umgebungsvariable der -classpath
(oder -cp
) Befehlszeilenoption. Das heißt, Wildcards werden in all diesen Fällen beachtet. Allerdings werden Platzhalter für Klassenpfade nicht in der Option Class-Path jar-manifest
Kopfzeile.
Hinweis: Aufgrund eines bekannten Fehlers in Java 8 muss in den Windows-Beispielen ein Backslash vor den Einträgen mit einem Sternchen am Ende stehen: https://bugs.openjdk.java.net/browse/JDK-8131329