webentwicklung-frage-antwort-db.com.de

Unterschiede zwischen "Java -cp" und "Java -jar"?

Was ist der Unterschied zwischen dem Ausführen einer Java - Anwendung mit
Java -cp CLASSPATH und Java -jar JAR_FILE_PATH? Wird einer von ihnen dem anderen vorgezogen, um eine Java) -Anwendung auszuführen? Ich meine, welche dieser Methoden ist für JVM teurer (je nach Verwendung der Maschinenressourcen)?

Welches führt dazu, dass JVM beim Ausführen der Anwendung mehr Threads erzeugt?

101
Reza

Ich bevorzuge die erste Version, um eine Java) -Anwendung zu starten, nur weil sie weniger Fallstricke aufweist ("welcome to classpath hell"). Die zweite Version benötigt eine ausführbare JAR-Datei, und der Klassenpfad für diese Anwendung muss angegeben werden innerhalb des Manifests der Klasse definiert werden (alle anderen Klassenpfad-Deklarationen werden unbemerkt ignoriert ...) In der zweiten Version müssten Sie also in die Klasse schauen, das Manifest lesen und herausfinden, ob die Klassenpfad-Einträge von gültig sind Wo das Glas aufbewahrt wird ... Das ist vermeidbar.

Ich erwarte für beide Versionen keine Leistungsvorteile oder -nachteile. Es sagt der JVM nur, welche Klasse für den Haupt-Thread verwendet werden soll und wo sie die Bibliotheken finden kann.

83
Andreas_D

Mit dem -cp Argument Sie geben den Klassenpfad an, d. h. den Pfad (die Pfade) zu zusätzlichen Klassen oder Bibliotheken, die Ihr Programm möglicherweise benötigt, wenn es kompiliert oder ausgeführt wird. Mit -jar Sie geben die ausführbare JAR-Datei an, die Sie ausführen möchten.

Sie können nicht beide angeben. Wenn Sie versuchen, Java -cp folder/myexternallibrary.jar -jar myprogram.jar dann wird es nicht wirklich funktionieren. Der Klassenpfad für diese JAR sollte in ihrem Manifest angegeben werden, nicht als -cp Streit.

Mehr dazu finden Sie hier und hier .

PS: -cp und -classpath sind Synonyme.

52
Radu Murzea

Bei Verwendung von Java -cp Müssen Sie einen vollständig qualifizierten Hauptklassennamen angeben, z.

Java -cp com.mycompany.MyMain

Bei Verwendung von Java -jar myjar.jar Muss Ihre JAR-Datei die Informationen über die Hauptklasse über die Datei manifest.mf liefern, die in der JAR-Datei im Ordner META-INF Enthalten ist:

Main-Class: com.mycompany.MyMain

14
AlexR

Java -cp CLASSPATH ist erforderlich, wenn Sie den gesamten Code im Klassenpfad angeben möchten. Dies ist nützlich zum Debuggen von Code.

Das jarred ausführbare Format: Java -jar JarFile kann verwendet werden, wenn Sie die App mit einem einzigen kurzen Befehl starten möchten. Sie können zusätzliche abhängige JAR-Dateien in Ihrem MANIFEST mithilfe von durch Leerzeichen getrennten JARs in einem Class-Path-Eintrag angeben, z.

Class-Path: mysql.jar infobus.jar acme/beans.jar

Beide sind leistungsmäßig vergleichbar.

10
Reimeus

Wie bereits erwähnt, dient -cp nur dazu, der jvm in der Befehlszeile mitzuteilen, welche Klasse für den Haupt-Thread verwendet werden soll und wo sie die Bibliotheken finden kann (Klassenpfad definieren). In -jar wird erwartet, dass der Klassenpfad und die Hauptklasse im Manifest der JAR-Datei definiert werden. So dient other dazu, Dinge in der Befehlszeile zu definieren, während other sie im Jar-Manifest findet. Es gibt keinen Unterschied in der Leistung. Sie können sie nicht gleichzeitig verwenden, da -jar das -cp überschreibt.

Auch wenn Sie -cp verwenden, wird die Manifestdatei dennoch überprüft. So können Sie einige der Klassenpfade im Manifest und einige in der Befehlszeile definieren. Dies ist besonders nützlich, wenn Sie eine Abhängigkeit von einem Drittanbieter-JAR haben, das Sie möglicherweise nicht mit Ihrem Build bereitstellen oder nicht bereitstellen möchten (vorausgesetzt, es befindet sich bereits auf dem System, auf dem es beispielsweise installiert werden soll). Sie können es also verwenden, um externe Gläser bereitzustellen. Die Position kann zwischen den Systemen variieren oder es kann sogar eine andere Version auf einem anderen System (aber mit denselben Schnittstellen) vorhanden sein. Auf diese Weise können Sie die App mit einer anderen Version erstellen und die tatsächliche Abhängigkeit von Drittanbietern zum Klassenpfad in der Befehlszeile hinzufügen, wenn Sie sie auf verschiedenen Systemen ausführen.

1
Pehmolelu

In Bezug auf die Leistung wird es keinen Unterschied geben. Mit Java - cp können wir die erforderlichen Klassen und JARs im Klassenpfad angeben, um eine Java class file auszuführen.

Wenn es sich um eine ausführbare JAR-Datei handelt. Wenn der Befehl Java -jar verwendet wird, findet jvm die Klasse, die ausgeführt werden muss, aus der Datei /META-INF/MANIFEST.MF in der JAR-Datei.

1