In alcuni casi, un programma può essere eseguito in modi diversi e mostrare comportamenti diversi su come viene chiamato. Se chiami vim
come vi
, viene eseguito in una modalità di compatibilità. A volte è necessario provare a mantenere una versione di diversi programmi correlati - ad esempio mailq
e newaliases
su molti sistemi unix sono un collegamento a sendmail
in modo che questi programmi rimangano sincronizzati)
I programmi Java sono normalmente chiamati come:
% java -jar foo.jar args
% java Foo args
La prima versione è dove hai un file Manifest che indica la classe principale, la seconda versione esegue il metodo principale nella classe Foo
trovata nel percorso della classe.
Le informazioni presentate per Java sono o un percorso per il jar o il nome della classe da invocare.
La posizione del barattolo non è abbastanza importante da poter essere codificata da (e in realtà non faceva parte delle specifiche originali). Un Jar può essere chiamato davvero qualcosa e spesso include i numeri di versione. Qualunque cosa sia, non c'è garanzia che la classe sia stata persino memorizzata in una .jar (potrebbe essere stata estratta).
Il richiamo di un'applicazione Java con -jar
ha solo un modo per inserirlo: la classe definita nel Manifest. Non è possibile rinominare ciò che è possibile fare.
L'altra opzione, di invocarla con il nome della classe, punta direttamente all'unità di esecuzione. Inoltre, non può essere chiamato multiply - non puoi avere Bar.class
essere il codice per class Foo
semplicemente non funziona in questo modo.
Questo dovrebbe mostrare che non ha davvero senso passare le informazioni di argv[0]
nel senso C a un'applicazione Java - o sarà java
, senza significato e arbitrario, o il nome della classe che è in corso invocato (che stai già eseguendo il codice da (potresti fare qualcosa come getClass().getEnclosingClass().getName()
se fossi disperata ...)).
C'è un punto qui, è possibile definire più metodi Main nelle classi in un .jar o sul percorso della classe. E potresti far sì che si comportino in modo diverso, proprio come se esistesse una serie di istruzioni if basate su cosa fosse argv[0]
.
In passato ho avuto un codice simile a java -cp Foo.jar com.me.foo.Test
che ha invocato il metodo Main della classe Test
piuttosto che quello definito in quello definito nel manifest.