Em alguns casos, um programa pode ser executado de maneiras diferentes e exibir um comportamento diferente de como é chamado. Se você chamar vim
como vi
, ele será executado em um modo de compatibilidade. Às vezes, é tentar manter uma versão de vários programas relacionados - por exemplo, mailq
e newaliases
em muitos sistemas unix há um link para sendmail
que 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 Foo
encontrada 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 -jar
apenas 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.class
o código, class Foo
pois 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á java
sem 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.Test
que invocava o Test
método Main da classe, em vez do definido no definido no Manifesto.
foo.exe
.java com.me.Foo
como linha de comando, o métodocom.me.Foo.main(String...)
está sendo chamado. Não há jeito de contornar isso. E eu sei que é Foo que está sendo invocado - não há razão para colocar isso no argumento. Seria informação puramente redundante. Claro, poderia estar na superclasse, mas tenho a oportunidade trivial de interceptá-lo com as informações desejadas sobre qual era a chamada da linha de comando - não há necessidade de colocá-lo em argv.na verdade, não há nenhum benefício com isso, depende realmente da sintaxe da linguagem de programação que você está usando, se for baseada em 0 ou baseada em 1. a variável (que você se refere como nome do arquivo) também depende do idioma; pode ser diferente em outros idiomas; basta seguir a sintaxe correta do idioma que você está usando.
fonte