En algunos casos, un programa puede ejecutarse de diferentes maneras y exhibir un comportamiento diferente sobre cómo se llama. Si llama vim
como vi
, se ejecuta en un modo de compatibilidad. A veces es para tratar de mantener una versión de varios programas relacionados, por ejemplo, mailq
y newaliases
en muchos sistemas Unix hay un enlace para sendmail
que estos programas permanezcan sincronizados)
Los programas Java generalmente se invocan como:
% java -jar foo.jar args
% java Foo args
La primera versión es donde tiene un archivo Manifiesto que indica la clase principal, la segunda versión ejecuta el método principal en la clase que se Foo
encuentra en la ruta de clase.
La información presentada para Java es una ruta al jar o el nombre de la clase que se invoca.
La ubicación del jar no es lo suficientemente importante como para ser algo para codificar (y en realidad no era parte de la especificación original). Un Jar puede llamarse realmente cualquier cosa, y a menudo incluye números de versión. Además, no hay garantía de que la clase se haya almacenado en un archivo .jar (podría haberse extraído).
Invocar una aplicación Java -jar
solo tiene una forma de ingresarla: la clase definida en el Manifiesto. No hay cambio de nombre que se pueda hacer.
La otra opción, invocarlo con el nombre de la clase apunta directamente a la unidad de ejecución. Además, no se puede nombrar multiplicar, no puede haber Bar.class
sido el código porque class Foo
simplemente no funciona de esa manera.
Esto debería mostrar que realmente no tiene sentido pasar la información argv[0]
en sentido C a una aplicación Java, ya sea java
sin sentido y arbitraria, o el nombre de la clase que se invoca (que ya está ejecutando código) de (podrías hacer algo como getClass().getEnclosingClass().getName()
si estuvieras desesperado ...)).
Aquí hay un punto, puede definir múltiples métodos Main en clases en un .jar o en la ruta de clase. Y podría hacer que se comporten de manera diferente como si hubiera una serie de declaraciones if basadas en lo que argv[0]
era.
En el pasado, tuve un código similar al java -cp Foo.jar com.me.foo.Test
que invocaba el Test
método Main de la clase en lugar del que se definió en el definido en el Manifiesto.
foo.exe
.