Por que o Java não coloca o nome do arquivo em args?

20

Em C e C ++, o método principal mantém o nome do arquivo na primeira posição da matriz em argv [0]. Em Java, no entanto, o nome do arquivo não está incluído na matriz de sequências args.

Existe uma razão prática para isso? Eu entendo que isso faz a iteração através dos argumentos da linha de comando com base em 0 em vez de em 1, mas existe algum benefício? O nome do arquivo foi apenas considerado inútil?

Jordan L
fonte

Respostas:

17

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.


fonte
Tem que haver mais do que isso. Em C #, os parâmetros não contêm o nome do arquivo, mas o aplicativo geralmente é executado diretamente, apenas foo.exe.
svick
@svick Eu não estou familiarizado com c #, nem como um exe é empacotado. Em alguns SOs, você pode tornar um jar executável (veja isso ) que inicia o ponto de entrada definido no Manifesto. Coisas semelhantes podem ser feitas para C #. O principal é que você não pode alterar o ponto de entrada alterando o nome do arquivo, e o nome do arquivo não deve ser usado por nenhuma outra parte do aplicativo (fora do carregador de classes).
@nqzero ( contexto ) - Se eu especificar java com.me.Foocomo linha de comando, o método com.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.
... e lembre-se de receber 50 representantes e comentar, em vez de sugerir edições na resposta. É uma maneira muito ruim de levantar problemas com um determinado post.
Às vezes o comportamento é radicalmente diferente. wput, por exemplo, é realmente wget.
mckenzm 2/10
-4

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.

user2723735
fonte
1
Como isso responde à pergunta?
gnat