W niektórych przypadkach program może być uruchamiany na różne sposoby i wykazywać różne zachowanie w zależności od tego, jak się nazywa. Jeśli zadzwonisz vim
jako vi
, działa w trybie zgodności. Czasami jest to, aby spróbować utrzymać jedną wersję kilku powiązanych programów - na przykład mailq
i newaliases
na wielu systemach uniksowych jest link do sendmail
tak, że programy te pobyt w synchronizacji)
Programy Java są zwykle wywoływane jako:
% java -jar foo.jar argumenty
Argumenty% java Foo
Pierwsza wersja zawiera plik manifestu wskazujący klasę główną, druga wersja uruchamia główną metodę w klasie Foo
znalezionej na ścieżce klasy.
Informacje prezentowane dla Java są ścieżką do jar lub nazwą wywoływanej klasy.
Lokalizacja słoika nie jest wystarczająco ważna, aby być czymś do zakodowania (i nie była częścią oryginalnej specyfikacji). Słoik można nazwać dowolną nazwą i często zawiera on numery wersji. Co więcej, nie ma gwarancji, że klasa była nawet przechowywana w .jar (można ją było wyodrębnić).
Wywołanie aplikacji Java -jar
ma tylko jeden sposób, aby do niej wejść - klasę zdefiniowaną w Manifeście. Zmiana nazwy nie jest możliwa.
Inna opcja - wywołanie go z nazwą klasy wskazuje bezpośrednio na jednostkę wykonawczą. Co więcej, nie można go nazwać mnożnikiem - nie możesz Bar.class
być kodem, class Foo
ponieważ po prostu nie działa w ten sposób.
Powinno to pokazać, że naprawdę nie ma sensu przekazywać informacji argv[0]
w sensie C do aplikacji Java - albo będzie ona java
, bez znaczenia i arbitralna, albo nazwa klasy, która jest wywoływana (że już wykonujesz kod z (możesz zrobić coś, jak getClass().getEnclosingClass().getName()
gdybyś był zdesperowany ...)).
Jest tu punkt, możesz zdefiniować wiele metod Main w klasach w .jar lub na ścieżce klas. I możesz sprawić, by zachowywały się inaczej, tak jakby istniała seria instrukcji if opartych na tym, co argv[0]
było.
W przeszłości miałem kod podobny do tego, java -cp Foo.jar com.me.foo.Test
który wywoływał Test
metodę Main klasy, a nie metodę zdefiniowaną w Manifeście.
foo.exe
.java com.me.Foo
jako linię poleceń, metodacom.me.Foo.main(String...)
jest wywoływana. Nie można tego obejść. I wiem, że przywoływane jest Foo - nie ma powodu, aby trzymać się tego w argv. Byłaby to czysto zbędna informacja. Jasne, może być w nadklasie, ale mam trywialną okazję, aby przechwycić ją z pożądaną informacją o tym, jakie było wywołanie linii poleceń - nie trzeba umieszczać jej w argv.właściwie nie ma z tym żadnych korzyści, to naprawdę zależy od składni używanego języka programowania, jeśli jest on oparty na 0 lub 1. zmienna (nazywana nazwą pliku) zależy również od języka, może być inna w innych językach, po prostu przestrzegaj poprawnej składni języka, którego używasz.
źródło