142 votes

Différences entre "java -cp" et "java -jar" ?

Quelle est la différence entre l'exécution d'une application Java avec
java -cp CLASSPATH y java -jar JAR_FILE_PATH ? L'une d'entre elles est-elle préférable à l'autre pour faire fonctionner une application Java ? Je veux dire laquelle de ces méthodes est la plus coûteuse pour la JVM (en fonction de l'utilisation des ressources de la machine) ?

Lequel des deux fera en sorte que la JVM génère plus de threads lors de l'exécution de l'application ?

112voto

Andreas_D Points 64111

Je préfère la première version pour démarrer une application java simplement parce qu'elle comporte moins de pièges ("welcome to classpath hell"). La deuxième version nécessite un fichier jar exécutable et le classpath de cette application doit être défini dans le manifeste du jar (toute autre déclaration de classpath sera ignorée en silence...). Donc, avec la deuxième version, vous devrez regarder dans le jar, lire le manifeste et essayer de savoir si les entrées classpath sont valides à partir de l'endroit où le jar est stocké... C'est évitable.

Je ne m'attends pas à ce que les deux versions présentent des avantages ou des inconvénients en termes de performances. Il s'agit juste d'indiquer au jvm quelle classe utiliser pour le thread principal et où il peut trouver les bibliothèques.

70voto

Radu Murzea Points 4716

Avec le -cp vous fournissez le classpath, c'est-à-dire le(s) chemin(s) d'accès aux classes ou bibliothèques supplémentaires dont votre programme peut avoir besoin lors de sa compilation ou de son exécution. Avec -jar vous spécifiez le fichier JAR exécutable que vous voulez lancer.

Vous ne pouvez pas spécifier les deux. Si vous essayez d'exécuter java -cp folder/myexternallibrary.jar -jar myprogram.jar alors cela ne fonctionnera pas vraiment. Le chemin de classe de ce JAR doit être spécifié dans son manifeste, et non pas en tant que fichier -cp argument.

Vous pouvez en savoir plus à ce sujet aquí y aquí .

PS : -cp y -classpath sont des synonymes.

23voto

AlexR Points 60796

Lorsque vous utilisez java -cp vous devez fournir le nom de la classe principale entièrement qualifié, par ex.

java -cp com.mycompany.MyMain

Lorsque vous utilisez java -jar myjar.jar votre fichier jar doit fournir les informations sur la classe principale via manifest.mf contenu dans le fichier jar dans le dossier META-INF :

Main-Class: com.mycompany.MyMain

10voto

Reimeus Points 93429

Java -cp CLASSPATH est nécessaire si vous souhaitez spécifier tout le code dans le classpath. Ceci est utile pour le débogage du code.

Le format de l'exécutable en jarred : java -jar JarFile peut être utilisé si vous souhaitez démarrer l'application avec une seule commande courte. Vous pouvez spécifier des fichiers jar dépendants supplémentaires dans votre MANIFEST en utilisant des jars séparés par des espaces dans une entrée Class-Path, par exemple :

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

Les deux sont comparables en termes de performances.

2voto

Pehmolelu Points 1579

Comme déjà dit, le -cp est juste pour dire au jvm dans la ligne de commande quelle classe utiliser pour le thread principal et où il peut trouver les bibliothèques (définir classpath). En -jar, il s'attend à ce que le class-path et la classe principale soient définis dans le manifeste du fichier jar. Ainsi, l'un sert à définir les choses en ligne de commande et l'autre à les trouver dans le manifeste du fichier jar. Il n'y a pas de différence de performance. Vous ne pouvez pas les utiliser en même temps, -jar remplacera le -cp.

Même si vous utilisez -cp, il vérifiera toujours le fichier manifeste. Vous pouvez donc définir certains des chemins de classe dans le manifeste et d'autres dans la ligne de commande. Ceci est particulièrement utile lorsque vous avez une dépendance sur un jar tiers, que vous ne fournissez pas avec votre compilation ou que vous ne voulez pas fournir (en espérant qu'il soit déjà trouvé sur le système où il doit être installé par exemple). Vous pouvez donc l'utiliser pour fournir des jars externes. Son emplacement peut varier d'un système à l'autre ou il peut même avoir une version différente sur différents systèmes (mais avec les mêmes interfaces). De cette façon, vous pouvez construire l'application avec une autre version et ajouter la dépendance réelle de la tierce partie à class-path sur la ligne de commande lors de l'exécution sur différents systèmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X