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
.java com.me.Foo
como línea de comando,com.me.Foo.main(String...)
se invoca el método . No hay forma de evitar eso. Y sé que se está invocando a Foo, no hay razón para pegar eso en argv. Sería información puramente redundante. Claro, podría estar en la superclase, pero tengo la oportunidad trivial de interceptarlo con la información deseada de cuál era la invocación de la línea de comando; no es necesario ponerlo en argv.en realidad no tiene ningún beneficio, realmente depende de la sintaxis del lenguaje de programación que esté utilizando si está basado en 0 o en 1. la variable (a la que se refiere como nombre de archivo) también depende del idioma, puede ser diferente en otros idiomas, solo siga la sintaxis correcta del idioma que está utilizando.
fuente