Gibt es eine Möglichkeit, alle JAR-Dateien in einem Verzeichnis in den Klassenpfad aufzunehmen?
Ich versuche es java -classpath lib/*.jar:. my.package.Program
und es ist nicht in der Lage, Klassendateien zu finden, die sich sicherlich in diesen Gläsern befinden. Muss ich jede JAR-Datei separat zum Klassenpfad hinzufügen?
java
command-line
classpath
Chris Serra
quelle
quelle
.jar
Teil, (2) muss mindestens 2 Teile haben, die unter;
Windows durch ein getrennt sind (was normalerweise:
anderswo ist). Zum Beispiel:java -classpath ".;lib/*" Program
Antworten:
Bei Verwendung von Java 6 oder höher unterstützt die Option classpath Platzhalter. Beachten Sie das Folgende:
"
)*
nicht*.jar
Windows
Unix
Dies ähnelt Windows, verwendet jedoch
:
anstelle von;
. Wenn Sie keine Platzhalter verwenden können,bash
ist die folgende Syntax zulässig (wobeilib
sich das Verzeichnis mit allen Java-Archivdateien befindet):(Beachten Sie, dass die Verwendung eines Klassenpfads nicht mit der
-jar
Option kompatibel ist . Siehe auch: JAR-Datei mit mehreren Klassenpfadbibliotheken an der Eingabeaufforderung ausführen. )Platzhalter verstehen
Aus dem Classpath- Dokument:
Hinweis: Aufgrund eines bekannten Fehlers in Java 8 müssen die Windows-Beispiele einen umgekehrten Schrägstrich vor den Einträgen mit einem abschließenden Sternchen verwenden: https://bugs.openjdk.java.net/browse/JDK-8131329
quelle
tr
funktioniert!java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass
ohne Anführungszeichen und es funktioniert gut. Ich frage mich, warum Shell es nicht erweitert und Fehler macht.~
in der -cpUnter Windows funktioniert dies:
und das funktioniert nicht:
Beachten Sie die * .jar, daher sollte der * Platzhalter alleine verwendet werden .
Unter Linux funktioniert Folgendes:
Die Trennzeichen sind Doppelpunkte anstelle von Semikolons.
quelle
*.jar
aber nur mit*
.:
einer Plattform und;
der anderen zu kennen. :) Ich kompiliere ungefähr einmal im Jahr mit Java über die Kommandozeile, gerade genug, um mich nicht daran zu erinnern, wie oft noch nervig.Wir umgehen dieses Problem, indem wir eine Haupt- JAR-Datei bereitstellen,
myapp.jar
die eine manifest (Manifest.mf
) - Datei enthält, die einen Klassenpfad mit den anderen erforderlichen Jars angibt, die dann daneben bereitgestellt werden. In diesem Fall müssen Sie nur deklarierenjava -jar myapp.jar
wenn Sie den Code ausführen.Wenn Sie also das Hauptmenü
jar
in einem Verzeichnis bereitstellen und dann die abhängigen Gläser in einenlib
Ordner darunter legen , sieht das Manifest folgendermaßen aus:NB: Dies ist plattformunabhängig. Wir können dieselben Jars verwenden, um auf einem UNIX-Server oder einem Windows-PC zu starten.
quelle
Meine Lösung unter Ubuntu 10.04 mit Java-Sun 1.6.0_24 mit allen Jars im Verzeichnis "lib":
Wenn dies fehlschlägt, sollte der folgende Befehl funktionieren (druckt alle * .jars im lib-Verzeichnis im Parameter classpath aus)
quelle
Kurze Antwort:
java -classpath lib/*:. my.package.Program
Oracle bietet eine Dokumentation zur Verwendung von Platzhaltern in Klassenpfaden hier für Java 6 und hier für Java 7 unter der Überschrift Grundlegende Platzhalter für Klassenpfade . (Während ich dies schreibe, enthalten die beiden Seiten die gleichen Informationen.) Hier ist eine Zusammenfassung der Highlights:
Im Allgemeinen können Sie den Platzhalter
*
( nicht*.jar
) verwenden , um alle JARs in ein bestimmtes Verzeichnis aufzunehmen .Der Platzhalter stimmt nur mit JARs überein, nicht mit Klassendateien. Um alle Klassen in einem Verzeichnis abzurufen, beenden Sie einfach den Klassenpfadeintrag unter dem Verzeichnisnamen.
Die beiden oben genannten Optionen können kombiniert werden, um alle JAR- und Klassendateien in ein Verzeichnis aufzunehmen, und es gelten die üblichen Regeln für die Priorität von Klassenpfaden. Z.B
-cp /classes;/jars/*
Der Platzhalter sucht nicht nach JARs in Unterverzeichnissen.
Die obigen Aufzählungspunkte sind wahr, wenn Sie die
CLASSPATH
Systemeigenschaft oder die Befehlszeilenflags-cp
oder verwenden-classpath
. Wenn Sie jedoch denClass-Path
JAR-Manifest-Header verwenden (wie dies bei einer Ant-Build-Datei der Fall ist ), werden Platzhalter nicht berücksichtigt.Ja, mein erster Link ist derselbe, der in der Antwort mit der höchsten Punktzahl angegeben ist (von der ich keine Hoffnung habe, sie zu überholen), aber diese Antwort bietet nicht viel Erklärung über den Link hinaus. Da diese Art von Verhalten entmutigt auf Stack - Überlauf in diesen Tagen , dachte ich , dass ich auf diese erweitern würde.
quelle
Windows :
Linux :
Denken Sie daran:
- Windows- Pfadtrennzeichen ist
;
- Linux- Pfadtrennzeichen ist
:
- In Windows ist das "Anführungszeichen" optional, wenn das cp-Argument keinen Leerraum enthält
quelle
Bei mir funktioniert das in Windows.
Für Linux
Ich benutze Java 6
quelle
Sie können Java http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html ausprobieren
-Djava.ext.dirs=jarDirectory
Verzeichnis für externe Jars beim Ausführen von Java
quelle
-Djava.ext.dirs=
VOR-jar
Richtig :
Falsch:
quelle
Wenn Sie wirklich alle JAR-Dateien dynamisch angeben müssen, können Sie Shell-Skripte oder Apache Ant verwenden . Es gibt ein Commons-Projekt namens Commons Launcher, mit dem Sie Ihr Startskript im Grunde genommen als Ant-Build-Datei angeben können (wenn Sie sehen, was ich meine).
Dann können Sie Folgendes angeben:
In Ihrer Start-Build-Datei, die Ihre Anwendung mit dem richtigen Klassenpfad startet.
quelle
Wenn Sie Java 6 verwenden, können Sie Platzhalter im Klassenpfad verwenden.
Jetzt ist es möglich, Platzhalter in der Klassenpfaddefinition zu verwenden:
Ref: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
quelle
Bitte beachten Sie, dass die Platzhaltererweiterung für Java 7 unter Windows nicht funktioniert.
Weitere Informationen finden Sie in diesem StackOverflow-Problem .
Die Problemumgehung besteht darin, ein Semikolon direkt nach dem Platzhalter einzufügen.
java -cp "somewhere/*;"
quelle
Wen es angeht,
Ich fand dieses seltsame Verhalten unter Windows unter einer MSYS / MinGW-Shell.
Werke:
Funktioniert nicht:
Ich bin mir ziemlich sicher, dass der Platzhalter nicht durch die Shell erweitert wird, weil z
(Versuchte es auch mit einem anderen Programm anstatt mit dem eingebauten
echo
, mit dem gleichen Ergebnis.)Ich glaube, es ist das,
javac
was versucht, es zu erweitern, und es verhält sich anders, ob das Argument ein Semikolon enthält oder nicht. Erstens wird möglicherweise versucht, alle Argumente zu erweitern, die wie Pfade aussehen. Und nur dann würde es sie analysieren-cp
und nur das folgende Zeichen nehmen. (Beachten Sie, dass diescom.comsol.aco_1.0.0.jar
die zweite JAR in diesem Verzeichnis ist.) Das ist alles eine Vermutung.Das ist
quelle
Alle oben genannten Lösungen funktionieren hervorragend, wenn Sie die Java-Anwendung außerhalb einer IDE wie Eclipse oder Netbeans entwickeln und ausführen.
Wenn Sie unter Windows 7 arbeiten und Eclipse IDE für die Entwicklung in Java verwenden, können Probleme auftreten, wenn Sie die in Eclipse erstellten Klassendateien mithilfe der Eingabeaufforderung ausführen.
Beispiel: Ihr Quellcode in Eclipse weist die folgende Pakethierarchie auf: edu.sjsu.myapp.Main.java
Sie haben json.jar als externe Abhängigkeit für Main.java
Wenn Sie versuchen, Main.java in Eclipse auszuführen, wird es ohne Probleme ausgeführt.
Wenn Sie jedoch versuchen, dies mit der Eingabeaufforderung auszuführen, nachdem Sie Main.java in Eclipse kompiliert haben, werden einige seltsame Fehler mit der Meldung "ClassNotDef Error blah blah" angezeigt.
Ich gehe davon aus, dass Sie sich im Arbeitsverzeichnis Ihres Quellcodes befinden !!
Verwenden Sie die folgende Syntax, um es an der Eingabeaufforderung auszuführen:
[Verpassen Sie nicht die. über]
Dies liegt daran, dass Sie die Datei Main.java im Paket edu.sjsu.myapp platziert haben und java.exe nach dem genauen Muster sucht.
Ich hoffe es hilft !!
quelle
Für Windows sind Anführungszeichen erforderlich und; sollte als Trennzeichen verwendet werden. z.B:
quelle
Kurzform: Wenn sich Ihr Main in einem JAR befindet, benötigen Sie wahrscheinlich einen zusätzlichen '-jar pathTo / yourJar / YourJarsName.jar', der explizit deklariert wurde, damit es funktioniert (obwohl sich 'YourJarsName.jar' im Klassenpfad befand) (oder , ausgedrückt, um die ursprüngliche Frage zu beantworten, die vor 5 Jahren gestellt wurde: Sie müssen nicht jedes Glas explizit neu deklarieren, aber es scheint, dass Sie selbst mit Java6 Ihr eigenes Glas neu deklarieren müssen ...)
Lange Form: (Ich habe dies so deutlich gemacht, dass ich hoffe, dass auch Eindringlinge von Java davon Gebrauch machen können.)
Wie viele hier verwende ich Eclipse zum Exportieren von Jars: (Datei-> Exportieren -> 'Runnable JAR File'). Es gibt drei Optionen für die Eclipse-Angebote (Juno) für die Bibliotheksverwaltung:
Normalerweise würde ich opt2 verwenden (und opt1 war definitiv fehlerhaft), aber nativer Code in einem der von mir verwendeten Gläser habe ich mit dem praktischen "jarinjar" -Trick entdeckt, den Eclipse nutzt, wenn Sie diese Option auswählen. Selbst nachdem mir klar wurde, dass ich opt3 benötige und dann diesen StackOverflow-Eintrag gefunden habe, habe ich noch einige Zeit gebraucht, um herauszufinden, wie ich mein Main außerhalb von Eclipse starten kann. Hier ist also, was für mich funktioniert hat, da es für andere nützlich ist ...
Wenn Sie Ihr Glas "fooBarTheJarFile.jar" genannt haben und alles so eingestellt ist, dass es in das Verzeichnis "/ theFully / qualifiedPath / toYourChosenDir" exportiert wird.
(Das Feld "Ziel exportieren" lautet: "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar")
Nachdem Sie auf "Fertig stellen" geklickt haben, finden Sie Eclipse und legen alle Bibliotheken in einem Ordner mit dem Namen "fooBarTheJarFile_lib" in diesem Exportverzeichnis ab.
Sie können dann von überall auf Ihrem System starten mit:
(Für Java-Neulinge: 'package.path_to.the_class_with.your_main' ist der deklarierte Paketpfad, den Sie oben in der Datei 'TheClassWithYourMain.java' finden, die die 'main (String [] args) {.. .} ', die Sie von außerhalb von Java ausführen möchten)
Die Falle, die Sie beachten sollten, ist, dass es nicht ausreicht, 'fooBarTheJarFile.jar' in der Liste der Jars auf Ihrem deklarierten Klassenpfad zu haben. Sie müssen explizit '-jar' deklarieren und den Speicherort dieses Jars neu deklarieren.
zB das bricht:
angepasst mit relativen Pfaden:
(unter Verwendung der Java-Version "1.6.0_27"; über die OpenJDK 64-Bit-Server-VM unter Ubuntu 12.04)
quelle
Ich weiß nur, wie ich es individuell machen kann, zum Beispiel:
Ich hoffe, das hilft!
quelle
for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
Klasse von wepapp:
quelle
Sie müssen sie alle separat hinzufügen. Wenn Sie wirklich nur ein Verzeichnis angeben müssen, können Sie alternativ alles in ein Verzeichnis aufheben und dieses Ihrem Klassenpfad hinzufügen. Ich empfehle diesen Ansatz jedoch nicht, da Sie bizarre Probleme bei der Versionierung und Unverwaltbarkeit von Klassenpfaden riskieren.
quelle
Keine direkte Lösung, um / * auf -cp setzen zu können, aber ich hoffe, Sie können das folgende Skript verwenden, um die Situation für dynamische Klassenpfade und lib-Verzeichnisse ein wenig zu vereinfachen.
Skript für Linux, könnte auch für Windows ein ähnliches haben. Wenn das richtige Verzeichnis als Eingabe für die "libDir2Scan4jars" bereitgestellt wird; Das Skript scannt alle Jars, erstellt eine Klassenpfadzeichenfolge und exportiert sie in eine env-Variable "tmpCLASSPATH".
quelle
macOS, aktueller Ordner
Für Java 13 unter macOS Mojave …
Wenn sich alle Ihre
.jar
Dateien im selben Ordner befinden,cd
machen Sie dies zu Ihrem aktuellen Arbeitsverzeichnis . Überprüfen Sie mitpwd
.Für die
-classpath
müssen Sie zuerst die JAR-Datei für Ihre App auflisten. Fügen Sie mit einem Doppelpunkt:
als Trennzeichen ein Sternchen hinzu*
, um alle anderen JAR-Dateien im selben Ordner abzurufen. Zuletzt übergeben Sie den vollständigen Paketnamen der Klasse mit Ihrermain
Methode .Beispiel: Für eine App in einer JAR-Datei
my_app.jar
mit einem Namenmain
in einer KlasseApp
in einem Paket mit dem Namencom.example
sowie einige benötigte Jars im selben Ordner:quelle
Stellen Sie sich eine JAR-Datei als Stamm einer Verzeichnisstruktur vor. Ja, Sie müssen alle separat hinzufügen.
quelle
Stellen Sie den Klassenpfad so ein, dass er für mehrere Jars und die Klassendateien des aktuellen Verzeichnisses geeignet ist.
quelle
Ich habe mehrere Gläser in einem Ordner. Der folgende Befehl hat bei mir funktioniert
JDK1.8
, um alle im Ordner vorhandenen Gläser einzuschließen. Bitte beachten Sie, dass dies in Anführungszeichen gesetzt werden muss, wenn Sie ein Leerzeichen im Klassenpfad habenWindows
Kompilieren:
javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java
Laufen:
java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram
Linux
Kompilieren:
javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java
Laufen:
java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram
quelle
Ich versuche, Java-Datei entweder als JAR oder als Klassen in Ubuntu auszuführen. Ich habe bei beiden Optionen versagt. Die folgende Ausnahme ist die Ausgabe.
oder
oder
Ich fand die Antwort:
Meine Dummheit.
Erster Schritt: Sie müssen das entsprechende Java einstellen: Ich hatte Java 11, aber ich habe die 8. Version als Java-Lib-Pfad festgelegt! - Sie können die Java-Version von hier aus einstellen:
2. Schritt: Führen Sie dann den folgenden Befehl aus, indem Sie den Pfad und die Dateinamen in den entsprechenden Pfad und die entsprechenden Dateien ändern:
Es wurde erfolgreich ausgeführt!
quelle