1186 Stimmen

Einbindung aller Jars in einem Verzeichnis in den Java-Klassenpfad

Gibt es eine Möglichkeit, alle JAR-Dateien innerhalb eines Verzeichnisses in den Klassenpfad aufzunehmen?

Ich versuche java -classpath lib/*.jar:. my.package.Program und es ist nicht in der Lage, Klassendateien zu finden, die in diesen Jars enthalten sind. Muss ich jede Jar-Datei separat zum Klassenpfad hinzufügen?

10voto

Wenn Sie wirklich alle .jar-Dateien dynamisch angeben müssen, können Sie Shell-Skripte verwenden, oder Apache-Ameise . Es gibt ein Commons-Projekt namens Commons Launcher mit dem Sie Ihr Startskript im Grunde als Ant-Build-Datei angeben können (wenn Sie verstehen, was ich meine).

Dann können Sie etwas angeben wie:

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

In Ihrer Launch-Build-Datei, die Ihre Anwendung mit dem richtigen Klassenpfad startet.

9voto

Jake Toronto Punkte 3334

Bitte beachten Sie, dass die Platzhaltererweiterung für Java 7 unter Windows nicht funktioniert.

チェックする dieses StackOverflow-Problem をご覧ください。

Die Abhilfe besteht darin, ein Semikolon direkt nach dem Platzhalter einzufügen. java -cp "somewhere/*;"

9voto

Evgeni Sergeev Punkte 20596

An alle, die es betrifft,

Ich habe dieses seltsame Verhalten unter Windows in einer MSYS/MinGW-Shell festgestellt.

Werke:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

Funktioniert nicht:

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options

Ich bin mir ziemlich sicher, dass der Platzhalter nicht von der Shell expandiert wird, da z.B.

$ echo './*'
./*

(Ich habe es auch mit einem anderen Programm versucht, anstatt mit dem eingebauten echo mit demselben Ergebnis).

Ich glaube, es ist javac das versucht, es zu erweitern, und es verhält sich unterschiedlich, je nachdem, ob das Argument ein Semikolon enthält oder nicht. Zuerst könnte es versuchen, alle Argumente zu expandieren, die wie Pfade aussehen. Und erst dann würde es sie parsen, mit -cp nur das folgende Token nehmen. (Beachten Sie, dass com.comsol.aco_1.0.0.jar ist das zweite JAR in diesem Verzeichnis). Das ist alles nur eine Vermutung.

Dies ist

$ javac -version
javac 1.7.0

6voto

realPK Punkte 2222

Alle oben genannten Lösungen funktionieren gut, wenn Sie die Java-Anwendung außerhalb einer IDE wie Eclipse oder Netbeans entwickeln und ausführen.

Wenn Sie unter Windows 7 arbeiten und die Eclipse IDE für die Java-Entwicklung verwenden, kann es zu Problemen kommen, wenn Sie die Eingabeaufforderung verwenden, um die in Eclipse erstellten Klassendateien auszuführen.

Ihr Quellcode in Eclipse hat z.B. die folgende Pakethierarchie: edu.sjsu.myapp.Main.java

Sie haben json.jar als externe Abhängigkeit für die Datei Main.java

Wenn Sie versuchen, Main.java in Eclipse auszuführen, wird es ohne Probleme laufen.

Aber wenn Sie versuchen, dies mit der Eingabeaufforderung nach dem Kompilieren von Main.java in Eclipse auszuführen, schießt es einige seltsame Fehler sagen "ClassNotDef Error blah blah".

Ich gehe davon aus, dass Sie sich im Arbeitsverzeichnis Ihres Quellcodes befinden!

Verwenden Sie die folgende Syntax, um es über die Eingabeaufforderung auszuführen:

  1. javac -cp ".;json.jar" Main.java

  2. java -cp ".;json.jar" edu.s

    [Verpassen Sie nicht das . oben]

Das liegt daran, dass Sie die Datei Main.java in das Paket edu.sjsu.myapp eingefügt haben und java.exe genau nach diesem Muster suchen wird.

Hoffentlich hilft es!

5voto

Basil Bourque Punkte 256611

MacOS, aktueller Ordner

Für Java 13 auf macOS Mojave

Wenn alle Ihre .jar Dateien in demselben Ordner befinden, verwenden Sie cd um das zu Ihrem aktuelles Arbeitsverzeichnis . Überprüfen Sie mit pwd .

Für die -classpath müssen Sie zunächst die JAR-Datei für Ihre Anwendung. Ein Doppelpunkt-Zeichen verwenden : als Begrenzungszeichen ein Sternchen anfügen * um alle anderen JAR-Dateien innerhalb desselben Ordners zu erhalten. Zum Schluss übergeben Sie den vollständigen Paketnamen der Klasse mit Ihrer main méthode .

Zum Beispiel für eine Anwendung in einer JAR-Datei namens my_app.jar mit einer main Methode in einer Klasse namens App in einem Paket namens com.example zusammen mit einigen benötigten Jars im selben Ordner:

java -classpath my_app.jar:* com.example.App

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X