2009-08-06 7 views
81

Ich habe so viele Bibliotheken von Drittanbietern (JAR-Dateien) verwendet, dass mein CLASSPATH vollständig durcheinander ist, da ich den Pfad für jede einzelne JAR-Datei, die ich verwende, einfügen muss.Wie verwendet man einen Platzhalter im Klassenpfad, um mehrere Gläser hinzuzufügen?

Ich habe mich gefragt, ob es eine Möglichkeit gibt, alle JAR-Dateien mit Wildcard (*) Operator (wie * .jar) in einen Ordner aufzunehmen. Aber es scheint nicht zu funktionieren. Gibt es noch eine andere Möglichkeit, den CLASSPATH zu kürzen, der momentan wie ein Aufsatz aussieht;) auf meinem PC ?.

+0

Es könnte ein Problem mit Platzhalter in Klassenpfad auf Windows geben: http://StackOverflow.com/Questions/11607873/escape-Wildcard-Processing-In-Application-Argumente –

+0

mögliche Duplikate von [Festlegen mehrerer Gläser in Java-Klassenpfad] (http: // Stapelüberlauf.com/questions/219585/setting-multiple-jars-in-java-classpath) –

Antwort

84

Von: http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html

Klassenpfadeinträge den Basisnamen Platzhalter * enthalten, die zur Angabe einer Liste aller Dateien im Verzeichnis mit der Endung .jar oder .JAR gleichwertig angesehen wird. Beispielsweise gibt der Klassenpfadeintrag foo/* alle JAR-Dateien im Verzeichnis foo an. Ein Klassenpfadeintrag, der einfach aus * besteht, wird zu einer Liste aller JAR-Dateien im aktuellen Verzeichnis erweitert.

Diese in Java6 funktionieren sollte, nicht sicher Java5

(Wenn es so scheint es, nicht wie erwartet funktioniert, versuchen Sie Anführungszeichen setzen zB. "foo/*")

+0

Ich fand den gleichen Link ein bisschen zu spät;). Danke trotzdem. – paulbullard

+0

TFM sagt, dass dies in Java 1.5 oder früher nicht möglich ist. –

+28

Timesaver-Tipp: Setzen Sie "*" (mit umgebenden doppelten Anführungszeichen) anstelle von *, damit dies funktioniert (zumindest unter Windows). :) – Amos

-1

Warum bereinigen Sie Ihr Chaos nicht, indem Sie die REQUIRED-JAR-Dateien in einen einzigen Ordner verschieben und den Klassenpfad auf den Ordner setzen? ;)

+0

Nun, genau das habe ich gemacht, aber ich habe den Platzhalter falsch benutzt (% PATH%/*. jar statt% PATH%/*). – paulbullard

5

Basename Wildcards in Java eingeführt wurden 6; h. "foo/*" bedeutet alle ".jar" -Dateien im "foo" -Verzeichnis. In früheren Java-Versionen, die keine Platzhalter-Klassenpfade unterstützen, habe ich ein Shell-Wrapper-Skript verwendet, um einen Classpath zu kompilieren, indem ein Muster "globbing" und die Ergebnisse so verändert werden, dass an den entsprechenden Stellen Zeichen ":" eingefügt werden. Das wäre in einer BAT-Datei schwer zu tun ...

0

Wenn Sie meinen, dass Sie eine Umgebungsvariable namens CLASSPATH haben, würde ich sagen, das ist Ihr Fehler. Ich habe so etwas auf keiner Maschine, mit der ich Java entwickle. CLASSPATH ist so an ein bestimmtes Projekt gebunden, dass es unmöglich ist, einen einzigen, korrekten CLASSPATH zu haben, der für alle funktioniert.

Ich setze CLASSPATH für jedes Projekt entweder mit einer IDE oder Ant. Ich mache eine Menge Web-Entwicklung, also verwenden jede WAR und EAR ihren eigenen CLASSPATH.

Es wird von IDEs und Anwendungsservern ignoriert. Warum hast du es? Ich würde empfehlen, es zu löschen.

19

Dies funktioniert unter Windows:

java -cp "lib/*" %MAINCLASS% 

wo %MAINCLASS% natürlich ist die Klasse der Hauptmechanismus enthält.

Alternativ:

java -cp "lib/*" -jar %MAINJAR% 

wo %MAINJAR% die JAR-Datei über sein internes Manifest zu starten ist.

+6

Ich konnte die Alternative nicht zum Arbeiten bekommen. -jar soll das -cp überschreiben und scheint dies auch dann zu tun, wenn der Klassenpfad nicht im jar-Manifest enthalten ist. Wenn Sie sowohl das Arbeitsverzeichnis als auch die lib einbinden wollen, scheint dies zu funktionieren: 'java -cp '. \ *; Lib \ *"% MAINCLASS% ' –

+0

Ganze Frage basierend auf der Alternative funktioniert nicht [hier] (http://stackoverflow.com/questions/250166/noclassdeffounderror-why-try-to-run-my-jar-with-java-exe-jar-whats-wron) –

+0

Hinweis: Mehrere Platzhalterzeichen können in einer einzelnen Klassenpfad-Deklaration angezeigt werden und kann mit anderen Nicht-Wildcard-Elementen kombiniert werden, zB 'java -cp" lib/*; lib2/*; lib3/spezifische.jar; config/' – kevinarpe