У деяких випадках програма може бути запущена різними способами і проявляти різну поведінку щодо того, як вона викликається. Якщо ви телефонуєте vim
як vi
, він працює в режимі сумісності. Іноді варто спробувати підтримувати одну версію декількох пов’язаних програм - наприклад, mailq
і newaliases
на багатьох системах Unix є посилання на sendmail
те, щоб ці програми залишалися синхронізованими)
Програми Java зазвичай викликаються як:
% java -jar foo.jar args
% аргументи java Foo
У першій версії є файл Manifest, який вказує на основний клас, друга версія запускає основний метод у класі, Foo
знайденому на шляху до класу.
Інформація, представлена для Java, - це або шлях до баночки, або назва класу, що викликається.
Розташування баночки недостатньо важливе, щоб було з чого кодувати (і насправді не було частиною оригінальної специфікації). Jar можна назвати будь-що дійсно, і часто включає номери версій. Більше того, немає гарантії, що клас навіть зберігався у .jar (його можна було витягти).
Викликання програми Java -jar
має лише один спосіб ввести її - клас, визначений у Manifest. Перейменування не може бути зроблено.
Інший варіант - виклик його з назвою класу безпосередньо до одиниці виконання. Крім того, його не можна назвати множити - у вас не може Bar.class
бути коду, class Foo
він просто не працює таким чином.
Це повинно показувати, що насправді немає сенсу передавати інформацію argv[0]
в сенсі С додатку Java - це буде java
безглуздим і довільним, або ім'ям класу, на який викликається (що ви вже виконуєте код з (ти міг би зробити щось на кшталт, getClass().getEnclosingClass().getName()
якби ти відчайдушно ...)).
Тут є сенс, ви можете визначити кілька основних методів у класах в .jar або на шляху до класу. І ви могли б змусити їх поводитись інакше так, як якщо б була серія, якщо висловлювання засновані на тому, що argv[0]
було.
У мене в минулому був схожий код, на java -cp Foo.jar com.me.foo.Test
який посилався на Test
основний метод класу, а не на той, який визначений у тому, який визначений у Manifest.
foo.exe
.