Was ist der Unterschied zwischen dem Ausführen einer Java - Anwendung mitJava -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?
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.
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.
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
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.
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.
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.