2010-05-26 14 views
33

Aus meiner Lesungen ausgeführt wird, wenn Sie einen Befehl ausführen, wie folgt:umfassen externe jar wenn java -jar

java -jar foo.jar 

Dann wird der Haupt Classpath wird ignoriert, und die Classpath aus der Manifest-Datei entnommen.

Außerdem wird der Klassenpfad, der in der Befehlszeile deklariert ist, ebenfalls ignoriert. So in:

java -classpath /usr/local/jar/foobar.jar -jar foo.jar 

/usr/local/jar/foobar.jar wird ignoriert.

Zuletzt habe ich gelesen, dass die Manifest-Datei nur relative Pfade innerhalb der JAR-Datei enthalten kann.

Also, wie enthalten Sie absolute Pfade zu externen Gläsern, die auf dem System vorhanden sind, aber nicht in der JAR-Datei ausgeführt wird?

+3

"Hinweis: Der Klassenpfad verweist auf Klassen oder JAR-Dateien im lokalen Netzwerk, ** keine JAR-Dateien in der JAR-Datei oder über Internetprotokolle zugängliche Klassen. ** Zum Laden von Klassen in JAR-Dateien in einer JAR-Datei In den Klassenpfad müssen Sie benutzerdefinierten Code zum Laden dieser Klassen schreiben.Wenn beispielsweise MyJar.jar eine andere JAR-Datei namens MyUtils.jar enthält, können Sie den Klassenpfad-Header im Manifest von MyJar.jar nicht verwenden, um Klassen in MyUtils zu laden. jar in den Klassenpfad. " Quelle: https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html –

Antwort

37

Gibt es einen Grund, warum Sie vermeiden die Hauptklasse aufrufen wie

java -cp /usr/local/jar/foobar.jar:/some/other/path.jar com.your.main.classname 

?

Diese Art des Aufrufs ermöglicht es Ihnen, absolute Pfade mit relativen Pfaden zu mischen. Fügen Sie dies in ein Shell-Skript oder eine Batch-Datei ein, um zu vermeiden, dass Sie den gesamten Klassenpfad eingeben oder speichern müssen, um Dinge zu vereinfachen.

+1

+1 für diese praktische Beratung! Oracle/SUN sollte die -jar-Option wirklich ablehnen ... es ist ein wiederkehrender Albtraum ... –

+4

Gut, '-jar' zu verwenden, kann in einigen Szenarien wesentlich einfacher sein, aber wenn Sie feststellen, dass die vereinfachte Option Ihnen Ärger macht, dann immer macht einen Rückfall zu der Option, die Ihnen die totale Kontrolle gibt –

34

Sie können einen Ordner namens say lib in dem Ordner erstellen, in dem Sie die JAR-Datei haben.

MANIFEST.MF Inhalte können sein:

Main-Class: com.mastergaurav.test.app.MainClass 
Class-Path: lib/one.jar lib/two.jar 

Ordnerinhalt:

mainFolder/ 
    * lib/one.jar 
    * lib/two.jar 
    * my-main.jar 

auszuführen:

+2

BTW, wenn Sie java -cp/addtional/class/path -jar abcd.jar ausführen, wird der zusätzliche Klassenpfad nicht sein ignoriert. –

+3

Sie haben absolut keine Ahnung, wie lange ich schon gesucht habe. Vielen Dank. – Bogdan

+0

Hervorragende Erklärung! Und, nebenbei gesagt, wird keine Wildcard unterstützt, wie traurig. –