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 Möglichkeiten ist für JVM teurer (je nach Nutzung der Maschinenressourcen)?
Welches führt dazu, dass JVM beim Ausführen der Anwendung mehr Threads erzeugt?
Mit dem
-cp
Argument geben Sie den Klassenpfad an, dh die Pfade zu zusätzlichen Klassen oder Bibliotheken, die Ihr Programm möglicherweise beim Kompilieren oder Ausführen benötigt. Mit geben-jar
Sie die ausführbare JAR-Datei an, die Sie ausführen möchten.Sie können nicht beide angeben. Wenn Sie versuchen zu laufen
java -cp folder/myexternallibrary.jar -jar myprogram.jar
, wird es nicht wirklich funktionieren. Der Klassenpfad für diese JAR sollte in ihrem Manifest angegeben werden, nicht als-cp
Argument.Mehr dazu finden Sie hier und hier .
PS:
-cp
und-classpath
sind Synonyme.quelle
-cp
und fragen-classpath
, gibt es keinen Unterschied.-jar
Sie an, welche ausführbare JAR Sie ausführen möchten. Geben-cp
Sie dabei die Pfade zu zusätzlichen Klassen / Bibliotheken an, die Ihr Programm möglicherweise benötigt. Die 2 haben sehr unterschiedliche Zwecke.java -jar PATH -cp PATH2
Bei der Verwendung müssen
java -cp
Sie einen vollständig qualifizierten Hauptklassennamen angeben, zjava -cp com.mycompany.MyMain
Bei Verwendung
java -jar myjar.jar
Ihrer JAR-Datei müssen die Informationen zur Hauptklasse über manifest.mf bereitgestellt werden, die in der JAR-Datei im Ordner enthalten sindMETA-INF
:Main-Class: com.mycompany.MyMain
quelle
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 angeben, indem Sie in einem Klassenpfadeintrag durch Leerzeichen getrennte JAR-Dateien verwenden, z.Beide sind hinsichtlich der Leistung vergleichbar.
quelle
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 (Klassenpfad definieren). In -jar wird erwartet, dass der Klassenpfad und die Hauptklasse im Manifest der JAR-Datei definiert werden. Andere dienen dazu, Dinge in der Befehlszeile zu definieren, während andere sie im JAR-Manifest finden. Es gibt keinen Unterschied in der Leistung. Sie können sie nicht gleichzeitig verwenden, -jar überschreibt -cp.
Auch wenn Sie -cp verwenden, wird die Manifestdatei überprüft. Sie können also einige der Klassenpfade im Manifest und einige in der Befehlszeile definieren. Dies ist besonders nützlich, wenn Sie von einem JAR eines Drittanbieters abhängig sind, das Sie möglicherweise nicht mit Ihrem Build bereitstellen oder nicht bereitstellen möchten (vorausgesetzt, es befindet sich bereits in dem System, auf dem es beispielsweise installiert werden soll). Sie können es also verwenden, um externe Gläser bereitzustellen. Der Standort kann zwischen den Systemen variieren oder es kann sogar eine andere Version auf einem anderen System vorhanden sein (jedoch mit denselben Schnittstellen). 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.
quelle
Es wird keinen Unterschied in Bezug auf die Leistung geben. Mit java - cp können wir die erforderlichen 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, findet jvm die Klasse, die ausgeführt werden muss, aus der Datei /META-INF/MANIFEST.MF in der JAR-Datei.
quelle