web-dev-qa-db-fra.com

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

Quelle est la différence entre exécuter une application Java avec
Java -cp CLASSPATH et Java -jar JAR_FILE_PATH? L'un d'entre eux est-il préféré à l'autre pour exécuter une application Java? Je veux dire laquelle de ces méthodes coûte le plus cher à la JVM (en fonction de l'utilisation des ressources de l'ordinateur)?

Lequel fera en sorte que JVM génère plus de threads tout en essayant d'exécuter l'application?

101
Reza

Je préfère que la première version démarre une application Java) simplement parce qu'elle comporte moins de pièges ("welcome to classpath hell").). La seconde nécessite un fichier jar exécutable et le chemin d'accès aux classes pour cette application doit être défini dans le manifeste du fichier jar (toutes les autres déclarations de chemin de classe seront ignorées en mode silencieux ...). Ainsi, avec la deuxième version, vous devrez examiner le fichier jar, lire le manifeste et essayer de savoir si les entrées du chemin de classe sont valides où le pot est stocké ... C'est évitable.

Je ne m'attends à aucun avantage ou inconvénient en termes de performances pour l'une ou l'autre version. Cela indique simplement à jvm quelle classe utiliser pour le thread principal et où il peut trouver les bibliothèques.

83
Andreas_D

Avec le -cp argument que vous fournissez le chemin de classe, c’est-à-dire le ou les chemins, à des classes ou des bibliothèques supplémentaires dont votre programme peut avoir besoin lors de la compilation ou de l’exécution. Avec -jar vous spécifiez le fichier JAR exécutable que vous souhaitez exécuter.

Vous ne pouvez pas les spécifier tous les deux. Si vous essayez de courir Java -cp folder/myexternallibrary.jar -jar myprogram.jar alors ça ne marchera pas vraiment. Le chemin de classe de ce fichier JAR doit être spécifié dans son manifeste, et non comme un fichier -cp argument.

Vous pouvez trouver plus à ce sujet ici et ici .

PS: -cp et -classpath sont des synonymes.

52
Radu Murzea

Lorsque vous utilisez Java -cp vous devez fournir un nom de classe principal complet, par exemple.

Java -cp com.mycompany.MyMain

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

Main-Class: com.mycompany.MyMain

14
AlexR

Java -cp CLASSPATH est nécessaire si vous souhaitez spécifier tout le code dans le chemin d'accès aux classes. Ceci est utile pour le débogage du code.

Le format de l'exécutable jar: 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 performance.

10
Reimeus

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 (define classpath). Dans -jar, le chemin de classe et la classe principale doivent être définis dans le fichier manifeste du fichier jar. Alors, autre est de définir les choses en ligne de commande pendant que d’autres les trouvent dans le manifeste de 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, le fichier manifeste sera toujours vérifié. Vous pouvez donc définir certains chemins de classe dans le manifeste et certains dans la ligne de commande. Ceci est particulièrement utile lorsque vous avez une dépendance sur un fichier jar tiers, que vous ne pouvez pas fournir avec votre construction ou que vous ne souhaitez pas fournir (en supposant qu’il soit déjà présent dans le système où il doit être installé, par exemple). Vous pouvez donc l'utiliser pour fournir des bocaux externes. Son emplacement peut varier d'un système à l'autre ou il peut même avoir une version différente sur un système différent (mais avec les mêmes interfaces). De cette façon, vous pouvez créer l'application avec une autre version et ajouter la dépendance tierce réelle à class-path sur la ligne de commande lors de son exécution sur différents systèmes.

1
Pehmolelu

Il n'y aura pas de différence en termes de performance. En utilisant Java - cp, nous pouvons spécifier les classes et les fichiers JAR requis dans le chemin de classe pour exécuter un fichier Java).

S'il s'agit d'un fichier jar exécutable. Lorsque la commande Java -jar est utilisée, jvm trouve la classe à exécuter à partir du fichier /META-INF/MANIFEST.MF dans le fichier jar.

1
ravi sankar reddy