Em alguns casos, um programa pode ser executado de maneiras diferentes e exibir um comportamento diferente de como é chamado. Se você chamar vimcomo vi, ele será executado em um modo de compatibilidade. Às vezes, é tentar manter uma versão de vários programas relacionados - por exemplo, mailqe newaliasesem muitos sistemas unix há um link para sendmailque esses programas fiquem sincronizados)
Os programas Java são normalmente chamados como:
% java -jar foo.jar args
% java Foo args
A primeira versão é onde você tem um arquivo de manifesto que indica a classe principal; a segunda versão executa o método principal na classe Fooencontrada no caminho da classe.
As informações apresentadas para Java são um caminho para o jar ou o nome da classe que está sendo chamada.
A localização do jar não é importante o suficiente para codificar (e na verdade não fazia parte da especificação original). Na verdade, um jar pode ter qualquer nome e geralmente inclui números de versão. Além do mais, não há garantia de que a classe foi armazenada em um .jar (ela poderia ter sido extraída).
A chamada de um aplicativo Java com -jarapenas uma maneira de inseri-lo - a classe definida no Manifesto. Não há renomeação que possa ser feita.
A outra opção, de invocá-lo com o nome da classe, aponta diretamente para a unidade de execução. Além disso, não pode ser chamado de multiplicar - você não pode ter Bar.classo código, class Foopois simplesmente não funciona dessa maneira.
Isso deve mostrar que realmente não há sentido em passar as informações argv[0]no sentido C para um aplicativo Java - será javasem sentido e arbitrário ou o nome da classe que está sendo chamada (que você já está executando o código de (você poderia fazer algo como getClass().getEnclosingClass().getName()se estivesse desesperado ...)).
Há um ponto aqui, você pode definir vários métodos principais nas classes em um .jar ou no caminho da classe. E você pode fazer com que eles se comportem de maneira diferente, como se houvesse uma série de declarações if com base no que argv[0]era.
No passado, eu tinha um código semelhante ao java -cp Foo.jar com.me.foo.Testque invocava o Testmétodo Main da classe, em vez do definido no definido no Manifesto.
foo.exe.