Dlaczego Java nie umieszcza nazwy pliku w args?


20

W C i C ++ główna metoda utrzymuje nazwę pliku na pierwszej pozycji tablicy w argv [0]. Jednak w Javie nazwa pliku nie jest zawarta w tablicy ciągów args.

Czy jest tego praktyczny powód? Rozumiem, że sprawia to, że iteracja za pomocą argumentów wiersza poleceń oparta jest na 0 zamiast na 1, ale czy istnieje korzyść? Czy nazwa pliku została uznana za bezużyteczną?

Odpowiedzi:


17

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 vimjako vi, działa w trybie zgodności. Czasami jest to, aby spróbować utrzymać jedną wersję kilku powiązanych programów - na przykład mailqi newaliasesna wielu systemach uniksowych jest link do sendmailtak, ż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 Fooznalezionej 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 -jarma 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.classbyć kodem, class Fooponieważ 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.Testktóry wywoływał Testmetodę Main klasy, a nie metodę zdefiniowaną w Manifeście.


Musi być w tym coś więcej. W języku C # parametry nie zawierają nazwy pliku, ale aplikacja jest zwykle wykonywana bezpośrednio, tylko foo.exe.
svick,

@svick Nie znam C # ani sposobu, w jaki exe jest pakowany. W kilku systemach operacyjnych możesz ustawić plik wykonywalny jar (zobacz to ), który uruchamia punkt wejścia zdefiniowany w Manifeście. Podobne rzeczy można zrobić dla C #. Kluczowe jest to, że nie można zmienić punktu wejścia, zmieniając nazwę pliku, a nazwa pliku nie jest przeznaczona do użycia przez inne części aplikacji (poza modułem ładującym klasy).

@nqzero ( kontekst ) - Jeśli podam java com.me.Foojako linię poleceń, metoda com.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.

... i pamiętaj, aby uzyskać 50 powtórzeń i komentarze zamiast sugerować zmiany w odpowiedzi. Jest to bardzo słaby sposób zgłaszania problemów z danym stanowiskiem.

Czasami zachowanie jest zupełnie inne. wput na przykład jest w rzeczywistości wget.
mckenzm

-4

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.


1
Jak to odpowiada na zadane pytanie?
komar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.