Frage Unterschiede zwischen "java -cp" und "java -jar"?


Was ist der Unterschied zwischen dem Ausführen einer Java-Anwendung?
java -cp CLASSPATH und java -jar JAR_FILE_PATH? Ist einer von ihnen dem anderen vorzuziehen, um eine Java-Anwendung auszuführen? Ich meine, welche dieser Möglichkeiten ist für JVM teurer (je nach Nutzung der Maschinenressourcen)?

Welches wird JVM veranlassen, mehr Threads zu spawnen, während versucht wird, die Anwendung auszuführen?


76
2017-08-12 13:52


Ursprung


Antworten:


Ich bevorzuge die erste Version, um eine Java-Anwendung zu starten, nur weil es weniger Probleme hat ("Willkommen in der Classpath-Hölle"). Der zweite benötigt eine ausführbare JAR-Datei und der Klassenpfad für diese Anwendung muss im Manifest des JARs definiert werden (alle anderen Classpath-Deklarationen werden stillschweigend ignoriert ...). Also mit der zweiten Version müssen Sie in das Jar schauen, lesen Sie das Manifest und versuchen Sie herauszufinden, ob die Klassenpfad-Einträge gültig sind von wo das Jar gespeichert ist ... Das ist vermeidbar.

Ich erwarte keine Performance-Vorteile oder Nachteile für beide Versionen. Es teilt der jvm nur mit, welche Klasse für den Hauptthread verwendet werden soll und wo sie die Bibliotheken finden kann.


62
2017-08-12 13:59



Mit dem -cp Argument Sie stellen den Klassenpfad, d. h. Pfad (e) zu zusätzlichen Klassen oder Bibliotheken bereit, 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 sie nicht beide angeben. Wenn du versuchst zu rennen java -cp folder/myexternallibrary.jar -jar myprogram.jar dann wird es nicht wirklich funktionieren. Der Klassenpfad für dieses JAR sollte in seinem Manifest angegeben werden, nicht als a -cp Streit.

Sie können mehr darüber finden Hier und Hier.

PS: -cp und -classpath sind Synonyme.


46
2017-08-12 13:56



Beim Benutzen java -cp Sie müssen einen vollständig qualifizierten Hauptklassennamen angeben, z.

java -cp com.mycompany.MyMain

Beim Benutzen java -jar myjar.jar Ihre JAR-Datei muss die Informationen über die Hauptklasse über die in der JAR-Datei im Ordner enthaltene Datei "manifest.mf" bereitstellen META-INF:

Main-Class: com.mycompany.MyMain


10
2017-08-12 13:57



java -cp CLASSPATH ist erforderlich, wenn Sie den gesamten Code im Klassenpfad angeben möchten. Dies ist nützlich für das Debugging von Code.

Das erschütterte 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 Klassenpfadeintrag angeben, z. B .:

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

Beide sind in Bezug auf die Leistung vergleichbar.


10
2017-08-12 13:57



Es wird keinen Unterschied in Bezug auf die Leistung geben. Mit java - cp können wir die benötigten Klassen und Jars im Klassenpfad angeben, um eine Java-Klassendatei auszuführen.

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


1
2017-08-12 15:57



Wie bereits gesagt, dient -cp nur dazu, der jvm in der Befehlszeile mitzuteilen, welche Klasse für den Hauptthread verwendet werden soll und wo sie die Bibliotheken finden kann (classepath definieren). In -jar erwartet es, dass der Klassenpfad und die Hauptklasse im JAR-Dateimanifest definiert werden. Das andere ist, Dinge in der Befehlszeile zu definieren, während andere sie im Jar finden. Es gibt keinen Unterschied in der Leistung. Sie können sie nicht gleichzeitig verwenden, -jar überschreibt das -cp.

Auch wenn Sie -cp verwenden, wird die Manifestdatei dennoch überprüft. Sie können also einige der Klassenpfade im Manifest und einige in der Befehlszeile definieren. Dies ist besonders nützlich, wenn Sie eine Abhängigkeit von einem JAR-Objekt von Drittanbietern haben, das Sie möglicherweise nicht mit Ihrem Build bereitstellen oder nicht bereitstellen möchten (vorausgesetzt, dass es bereits auf dem System gefunden wird, auf dem es installiert werden soll). Sie können damit externe Gläser bereitstellen. Der Standort kann von System zu System unterschiedlich sein oder es kann sogar eine andere Version auf einem anderen System (aber mit denselben Schnittstellen) geben. Auf diese Weise können Sie die App mit einer anderen Version erstellen und die tatsächliche Drittanbieterabhängigkeit dem Klassenpfad in der Befehlszeile hinzufügen, wenn Sie sie auf verschiedenen Systemen ausführen.


1
2018-02-03 07:21