Differenze tra "java -cp" e "java -jar"?


118

Qual è la differenza tra l'esecuzione di un'applicazione Java con
java -cp CLASSPATHe java -jar JAR_FILE_PATH? Uno di loro è preferito all'altro per l'esecuzione di un'applicazione Java? Voglio dire, quale di questi modi è più costoso per JVM (in base all'utilizzo delle risorse della macchina)?

Quale farà sì che JVM generi più thread durante il tentativo di eseguire l'applicazione?

Risposte:


97

Preferisco la prima versione per avviare un'applicazione java solo perché ha meno insidie ​​("benvenuto all'inferno del percorso di classe"). Il secondo richiede un file jar eseguibile e il classpath per quell'applicazione deve essere definito all'interno del manifest del jar (tutte le altre dichiarazioni classpath verranno silenziosamente ignorate ...). Quindi con la seconda versione dovresti guardare nel jar, leggere il manifest e provare a scoprire se le voci del classpath sono valide da dove è memorizzato il jar ... Questo è evitabile.

Non mi aspetto vantaggi o svantaggi in termini di prestazioni per nessuna delle due versioni. Sta solo dicendo alla jvm quale classe usare per il thread principale e dove può trovare le librerie.


E i fili? Sono gli stessi in termini di numero di thread che JVM genera durante il tentativo di eseguire l'applicazione?
Reza

1
Sì. Entrambe le versioni individueranno il metodo principale e lo eseguiranno con un singolo thread. La prima versione passa il classname come argomento, con la seconda versione, la jvm lo troverà all'interno del mainfest.
Andreas Dolk

@Andreas_D Per favore, dai un'occhiata a questo post , immagino di utilizzare -cp in modo sbagliato e non so come correggere il mio errore.
fu DL

60

Con l' -cpargomento fornisci il percorso di classe, ovvero il percorso (i) per classi o librerie aggiuntive che il tuo programma potrebbe richiedere quando viene compilato o eseguito. Con -jarsi specifica il file JAR eseguibile che si desidera eseguire.

Non puoi specificarli entrambi. Se provi a eseguire java -cp folder/myexternallibrary.jar -jar myprogram.jar, non funzionerà davvero. Il classpath per quel JAR dovrebbe essere specificato nel suo Manifest, non come -cpargomento.

Puoi trovare ulteriori informazioni su questo qui e qui .

PS: -cpe -classpathsono sinonimi.


La mia preoccupazione riguarda le risorse? c'è una differenza tra le risorse che usano?
Reza

@Hesam Se stai chiedendo delle differenze di prestazioni tra -cpe -classpath, allora no, non c'è differenza.
Radu Murzea

1
No! Intendevo la differenza di prestazioni tra -cp (o -classpath) e -jar
Reza

2
@Hesam Con -jarsi specifica quale JAR eseguibile si desidera eseguire. Con -cpsi specifica il percorso (i) per classi / librerie aggiuntive che il programma potrebbe richiedere. I 2 hanno scopi molto diversi.
Radu Murzea

@RaduMurzea, cosa vuoi dire che non funzionerebbe davvero quando li combiniamo? Ad esempiojava -jar PATH -cp PATH2
Pacerier

18

Quando si utilizza java -cpè necessario fornire un nome completo della classe principale, ad es

java -cp com.mycompany.MyMain

Quando si utilizza java -jar myjar.jaril file jar, è necessario fornire le informazioni sulla classe principale tramite manifest.mf contenute nel file jar nella cartella META-INF:

Main-Class: com.mycompany.MyMain


Per favore, dai un'occhiata a questo post , immagino di utilizzare -cp in modo sbagliato e non so come correggere il mio errore.
fu DL

10

java -cp CLASSPATH è necessario se si desidera specificare tutto il codice nel classpath. Questo è utile per il debug del codice.

Il formato eseguibile jarred: java -jar JarFilepuò essere utilizzato se desideri avviare l'app con un unico breve comando. Puoi specificare file jar dipendenti aggiuntivi nel tuo MANIFEST utilizzando jar separati da spazi in una voce del percorso di classe, ad esempio:

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

Entrambi sono comparabili in termini di prestazioni.


Per favore, dai un'occhiata a questo post , immagino di utilizzare -cp in modo sbagliato e non so come correggere il mio errore.
fu DL

2

Come già detto, -cp serve solo per dire alla jvm nella riga di comando quale classe usare per il thread principale e dove può trovare le librerie (definire classpath). In -jar si aspetta che il percorso della classe e la classe principale siano definiti nel manifest del file jar. Quindi altro serve per definire le cose nella riga di comando mentre altri le trovano all'interno del manifest jar. Non c'è differenza nelle prestazioni. Non puoi usarli contemporaneamente, -jar sovrascriverà -cp.

Sebbene anche se usi -cp, controllerà comunque il file manifest. Quindi puoi definire alcuni dei percorsi di classe nel manifest e alcuni nella riga di comando. Ciò è particolarmente utile quando si ha una dipendenza da alcuni jar di terze parti, che potresti non fornire con la tua build o che non vuoi fornire (aspettandoti che si trovi già nel sistema in cui deve essere installato, ad esempio). Quindi puoi usarlo per fornire barattoli esterni. La sua posizione può variare tra i sistemi o può anche avere una versione diversa su un sistema diverso (ma con le stesse interfacce). In questo modo puoi creare l'app con un'altra versione e aggiungere l'effettiva dipendenza di terze parti al percorso di classe sulla riga di comando quando viene eseguita su sistemi diversi.


1

Non ci sarà alcuna differenza in termini di prestazioni. Utilizzando java - cp possiamo specificare le classi e i jar richiesti nel classpath per eseguire un file di classe java.

Se è un file jar eseguibile. Quando viene utilizzato il comando java -jar, jvm trova la classe che deve essere eseguita dal file /META-INF/MANIFEST.MF all'interno del file jar.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.