In alcuni casi, un programma può essere eseguito in modi diversi ed esibire comportamenti diversi su come viene chiamato. Se chiami vim
come vi
, viene eseguito in una modalità di compatibilità. A volte è per cercare di mantenere una versione di diversi programmi correlati - ad esempio mailq
e newaliases
su molti sistemi unix sono un link per sendmail
mantenere sincronizzati questi programmi)
I programmi Java sono in genere invocati 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 un percorso del jar o il nome della classe che viene invocata.
La posizione del vaso non è abbastanza importante per essere qualcosa da cui codificare (e in realtà non faceva parte delle specifiche originali). Un Jar può essere chiamato con qualsiasi nome, e spesso include numeri di versione. Inoltre, non vi è alcuna garanzia che la classe sia stata persino memorizzata in un .jar (avrebbe potuto essere estratto).
Richiamare un'applicazione Java con -jar
ha solo un modo per accedervi: la classe definita nel Manifest. Non è possibile rinominare.
L'altra opzione, di invocarlo con il nome della classe, punta direttamente all'unità di esecuzione. Inoltre, non può essere chiamato moltiplicare - non puoi Bar.class
essere il codice class Foo
perché semplicemente non funziona in questo modo.
Questo dovrebbe mostrare che non ha davvero senso passare le informazioni argv[0]
in senso C a un'applicazione Java - o sarà java
, senza senso e arbitrario, o il nome della classe che viene invocata (che stai già eseguendo il codice di (potresti fare qualcosa come getClass().getEnclosingClass().getName()
se fossi disperato ...)).
C'è un punto qui, è possibile definire più metodi principali nelle classi in un .jar o nel percorso della classe. E potresti farli comportare diversamente come se ci fosse una serie di istruzioni if basate su ciò che argv[0]
era.
In passato ho avuto un codice simile a quello java -cp Foo.jar com.me.foo.Test
che invocava il Test
metodo Main della classe piuttosto che quello definito in quello definito nel Manifest.
foo.exe
.