У деяких випадках програма може бути запущена різними способами і проявляти різну поведінку щодо того, як вона викликається. Якщо ви телефонуєте 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.