it-swarm.com.de

Führen Sie eine JAR-Datei über die Befehlszeile aus und geben Sie den Klassenpfad an

Ich habe eine JAR -Datei kompiliert und die Hauptklasse im Manifest angegeben (ich habe den Eclipse-Export verwendet Funktion). Meine Abhängigkeiten befinden sich alle in einem Verzeichnis mit der Bezeichnung lib. Ich kann anscheinend keine eindeutige Antwort auf die Ausführung meiner JAR-Datei erhalten, während angegeben wird, dass lib/* Als Klassenpfad verwendet werden soll.

Ich habe es versucht:

]$ Java -jar -cp .:lib/* MyJar.jar
]$ Java -cp .:lib/* -jar MyJar.jar
]$ Java -cp .:lib/* com.somepackage.subpackage.Main

usw...

Jeder gibt einen Fehler mit den Worten:

Error: Could not find or load main class ....

oder gibt das NoClassDefFoundError an, das angibt, dass die Bibliotheken nicht gefunden werden.

Ich habe sogar versucht, die JAR-Datei neu zu erstellen und das lib -Verzeichnis und den Inhalt einzufügen, aber immer noch keine Würfel ...

Wie kann ich eine JAR-Datei über die Befehlszeile ausführen und den zu verwendenden Klassenpfad angeben?

102
SnakeDoc

Wenn Sie -jar Angeben, wird der Parameter -cp Ignoriert.

Von die Dokumentation :

Wenn Sie diese Option verwenden, ist die JAR-Datei die Quelle aller Benutzerklassen, und andere Benutzerklassenpfadeinstellungen werden ignoriert.

Sie können benötigte JAR-Dateien auch nicht in eine andere JAR-Datei "einschließen" (Sie müssten deren Inhalt extrahieren und die .class-Dateien in Ihre JAR-Datei einfügen).

Sie haben zwei Möglichkeiten:

  1. beziehen Sie alle JAR-Dateien aus dem Verzeichnis lib in das Manifest ein (Sie können dort relative Pfade verwenden).
  2. Geben Sie alles ( einschließlich Ihres jar) in der Befehlszeile mit -cp An:
    Java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
176

Führen Sie eine JAR-Datei aus und geben Sie einen Klassenpfad wie folgt an:

Java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar Ist der vollständige Name der JAR, die Sie ausführen möchten

libs/* Ist ein Pfad zu Ihren Abhängigkeits-JARs

com.test.App Ist der vollständig qualifizierte Name der Klasse aus der JAR, die die main(String[]) -Methode hat

Die JAR-Datei und die abhängige JAR-Datei sollten über Ausführungsberechtigungen verfügen.

30
Sid

Sie können dies in der Unix-Shell tun:

Java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

Sie können dies in Windows PowerShell tun:

Java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
6
tars

Alternativ können Sie das Manifest verwenden, um den Klassenpfad und die Hauptklasse anzugeben, wenn Sie möchten. Dann müssen Sie weder -cp Noch die Hauptklasse angeben. In Ihrem Fall würde es Zeilen wie diese enthalten:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

Leider müssen Sie jedes Glas im Manifest buchstabieren (kein Problem, da Sie dies nur einmal tun, und Sie können ein Skript zum Erstellen der Datei oder ein Build-Tool wie ANT oder Maven oder Gradle verwenden). Und die Referenz muss ein relatives oder absolutes Verzeichnis sein, in dem Sie den Java -jar MyJar.jar Ausführen.

Dann führen Sie es mit aus

Java -jar MyJar.jar
4
HankCa