В некоторых случаях программа может запускаться по-разному и демонстрировать различное поведение при ее вызове. Если вы звоните vim
как vi
, он работает в режиме совместимости. Иногда стоит попытаться сохранить одну версию нескольких связанных программ - например, mailq
и newaliases
во многих системах Unix есть ссылка, чтобы sendmail
эти программы оставались синхронизированными)
Java-программы обычно вызываются как:
% java -jar foo.jar args
% java Foo args
Первая версия, где у вас есть файл манифеста, который указывает основной класс, вторая версия запускает метод main в классе, Foo
найденном в пути к классам.
Информация, представленная для Java, представляет собой либо путь к jar-файлу, либо имя вызываемого класса.
Расположение jar не настолько важно, чтобы можно было что-то кодировать (и на самом деле оно не было частью оригинальной спецификации). Банку можно назвать как угодно, и часто включает номера версий. Более того, нет никакой гарантии, что класс был даже сохранен в .jar (он мог быть извлечен).
Вызов приложения Java с помощью -jar
имеет только один способ войти в него - класс, определенный в манифесте. Там нет переименования, которое может быть сделано.
Другой вариант вызова его с именем класса указывает непосредственно на модуль выполнения. Более того, его нельзя назвать умноженным - у вас не может Bar.class
быть кода, потому что class Foo
он просто так не работает.
Это должно показать, что на самом деле нет смысла передавать информацию argv[0]
в смысле C в Java-приложение - оно будет либо java
бессмысленным, либо произвольным, либо именем вызываемого класса (что вы уже выполняете код из из (вы могли бы сделать что-то вроде, getClass().getEnclosingClass().getName()
если бы вы были в отчаянии ...)).
Здесь есть смысл: вы можете определить несколько методов Main в классах в .jar или на пути к классам. И вы могли бы заставить их вести себя по-разному, как если бы был ряд утверждений, основанных на том, что argv[0]
было.
В прошлом у меня был код, похожий на тот, java -cp Foo.jar com.me.foo.Test
который вызывал Test
метод Main класса, а не тот, который определен в методе, определенном в Manifest.
foo.exe
.java com.me.Foo
в командной строке методcom.me.Foo.main(String...)
вызывается. Обойти это невозможно. И я знаю, что вызывается Foo - нет причин придерживаться этого в argv. Это была бы чисто избыточная информация. Конечно, это может быть в суперклассе, но у меня есть тривиальная возможность перехватить его с желаемой информацией о том, что был вызов командной строки - нет необходимости помещать его в argv.на самом деле это не приносит никакой пользы, это действительно зависит от синтаксиса языка программирования, который вы используете, если он основан на 0 или 1. переменная (вы называете имя файла) также зависит от языка, она может отличаться в других языках, просто следуйте правильному синтаксису языка, который вы используете.
источник