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?

4voto

Alexey Punkte 8727

Für Windows sind Anführungszeichen erforderlich und ; sollte als Trennzeichen verwendet werden. z.B.:

java -cp "target\\*;target\\dependency\\*" my.package.Main

4voto

Matt S. Punkte 838

Kurzform: Wenn Ihr main in einem jar ist, müssen Sie wahrscheinlich ein zusätzliches '-jar pathTo/yourJar/YourJarsName.jar' explizit deklarieren, damit es funktioniert (auch wenn 'YourJarsName.jar' auf dem Klassenpfad war) (oder, um die ursprüngliche Frage zu beantworten, die vor 5 Jahren gestellt wurde: Sie müssen nicht jedes jar explizit neu deklarieren, aber es scheint, dass Sie sogar mit java6 Ihr eigenes jar neu deklarieren müssen ...)


Langform: (Ich habe dies so explizit gemacht, dass ich hoffe, dass auch Java-Neulinge davon Gebrauch machen können)

Wie viele hier benutze ich Eclipse, um JAR-Dateien zu exportieren: (Datei->Export-->'Runnable JAR File'). Es gibt drei Optionen auf "Library handling" eclipse (Juno) bietet:

opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"

Normalerweise würde ich opt2 verwenden (und opt1 war definitiv brechen), jedoch nativen Code in einem der Jars ich verwende ich entdeckt bricht mit dem praktischen "jarinjar" Trick, dass Eclipse nutzt, wenn Sie diese Option auswählen. Auch nach der Erkenntnis, ich brauchte opt3, und dann diesen StackOverflow-Eintrag zu finden, es dauerte noch einige Zeit, um es herauszufinden, wie mein Haupt außerhalb von Eclipse zu starten, so hier ist, was für mich gearbeitet, wie es für andere nützlich ist ...


Wenn du dein Glas benannt hast: "fooBarTheJarFile.jar" und alles so eingestellt ist, dass es in das Verzeichnis: "/theFully/qualifiedPath/toYourChosenDir" exportiert wird.

(d.h. das Feld "Exportziel" lautet: "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar" )

Nachdem Sie auf "Fertig stellen" geklickt haben, werden Sie feststellen, dass Eclipse alle Bibliotheken in einen Ordner mit dem Namen "fooBarTheJarFile_lib" innerhalb des Exportverzeichnisses verschiebt, so dass Sie etwa Folgendes erhalten:

/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar

Sie können dann von überall auf Ihrem System mit starten:

java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain

(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 das 'main(String[] args){...}' enthält, das Sie von außerhalb von Java ausführen möchten)


Der Fallstrick, den Sie beachten müssen, ist, dass es nicht ausreicht, "fooBarTheJarFile.jar" in der Liste der Jars in Ihrem deklarierten Klassenpfad zu haben. Sie müssen explizit "-jar" deklarieren und den Ort dieses Jars neu deklarieren.

z.B. diese Pause:

 java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain

mit relativen Pfaden wiedergegeben:

cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   

(unter Verwendung der Java-Version "1.6.0_27"; über OpenJDK 64-Bit Server VM auf ubuntu 12.04)

3voto

ParseTheData Punkte 147

Die einzige Möglichkeit, die ich kenne, ist zum Beispiel, es individuell zu machen:

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

Ich hoffe, das hilft!

3voto

Daniel Spiewak Punkte 53301

Sie müssen sie alle einzeln hinzufügen. Wenn Sie alternativ wirklich nur ein Verzeichnis angeben müssen, können Sie alles in ein Verzeichnis entpacken und dieses zu Ihrem Klassenpfad hinzufügen. Ich empfehle diesen Ansatz jedoch nicht, da Sie bizarre Probleme bei der Klassenpfadversionierung und Unverwaltbarkeit riskieren.

3voto

Mindaugas K. Punkte 302

Klasse von wepapp:

  > mvn clean install

  > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2

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