Dans certains cas, un programme peut être exécuté de différentes manières et présenter un comportement différent sur la façon dont il est appelé. Si vous appelez vim
as vi
, il s'exécute en mode de compatibilité. Parfois, c'est pour essayer de maintenir une version de plusieurs programmes connexes - par exemple mailq
et newaliases
sur de nombreux systèmes Unix sont un lien vers sendmail
afin que ces programmes restent synchronisés)
Les programmes Java sont généralement appelés comme:
% java -jar foo.jar args
% java Foo args
La première version est l'endroit où vous avez un fichier manifeste qui indique la classe principale, la deuxième version exécute la méthode principale dans la classe Foo
trouvée dans le chemin de classe.
Les informations présentées pour Java sont soit un chemin d'accès au pot, soit le nom de la classe invoquée.
L'emplacement du pot n'est pas suffisamment important pour être quelque chose à coder (et ne faisait en fait pas partie des spécifications d'origine). Un Jar peut être vraiment nommé, et comprend souvent des numéros de version. De plus, il n'y a aucune garantie que la classe a même été stockée dans un .jar (elle aurait pu être extraite).
L'appel d'une application Java avec -jar
n'a qu'une seule façon de la saisir: la classe définie dans le manifeste. Aucun changement de nom ne peut être effectué.
L'autre option, de l'invoquer avec le nom de classe pointe directement vers l'unité d'exécution. De plus, il ne peut pas être nommé multiplier - vous ne pouvez pas avoir Bar.class
le code car class Foo
cela ne fonctionne pas de cette façon.
Cela devrait montrer qu'il n'y a vraiment aucun intérêt à transmettre les informations de argv[0]
dans le sens C à une application Java - ce sera java
, sans signification et arbitraire, ou le nom de la classe qui est invoquée (que vous exécutez déjà du code de (vous pourriez faire quelque chose comme getClass().getEnclosingClass().getName()
si vous étiez désespéré ...)).
Il y a un point ici, vous pouvez définir plusieurs méthodes Main dans les classes dans un .jar ou sur le chemin de classe. Et vous pourriez les faire se comporter différemment comme s'il y avait une série de déclarations if basées sur ce qui argv[0]
était.
Dans le passé, j'avais un code semblable à celui java -cp Foo.jar com.me.foo.Test
qui invoquait la Test
méthode Main de la classe plutôt que celle définie dans celle définie dans le manifeste.
foo.exe
.