Я пишу оболочку на Java, потому что слишком долго не программировал на Java и многое забыл. Я собирался написать свой собственный, но прямо сейчас я хотел бы получить работающий прототип, поэтому я хотел бы добавить существующий анализатор параметров командной строки.
Требования:
String
или String[]
(т.е. не использует аргументы из командной строки)getopt
(расширенная версия GNU); конкретно:
-a -b -c
, -abc
)--message="Hello!"
) (хотя он не должен поддерживать длинные параметры с одним тире)-abc --long="Hello!" param1 param2
, сообщает мне, что параметры param1
и param2
)--
может использоваться для отделения параметров от аргументов (например -ab --custom="hello" -- -file_starting_with_hyphen -another
, дает мне параметры/флаги a
, b
и custom
с соответствующими значениями и говорит мне, что аргументы -file_starting_with_hyphen
и -another
)-h foo
, говорит, что есть опция, h
, со значением, foo
)String
или , String[]
и он сообщает мне, какие флаги/параметры были установлены, в отличие от поиска параметров, которые я хочу установить, и предполагая, что остальные являются аргументами )
Идеально, но не обязательно:
java.util.Map
в частности, ) для возврата данных. (Это сделано для того, чтобы позже мне было легче написать свою собственную функцию)Вы можете проверить FeSimpleArgs
Я считаю, что он выполняет все ваши требования:
Концепция: очень легкий анализатор командной строки. Принимает аргументы в форме String или String[], возвращает экземпляр класса, содержащий аргументы в карте и параметры в списке.
Требования:
Имя опции, за которой следует значение, анализируется как опция, имеющая это значение (например, -h foo говорит, что есть опция h со значением foo) Да
Полностью кроссплатформенный Да
что касается использования:
Публикуется под лицензией Apache 2.0.
Идеально, но не обязательно:
ИСПОЛЬЗОВАНИЕ Использование: 1) Создайте экземпляр FeSimpleArgs
FeSimpleArgs parser = new FeSimpleArgs();
2) Используйте его для анализа ваших аргументов:
FeSimpleArgs.Result result = parser.parse ("-def=value1 --GHI=value2 -a -b -c=value3 -n=\"foo bar baz\" -- param1 -param2");
3) Изучите свои результаты: из вышеприведенного результат будет состоять из карты, содержащей следующие аргументы и флаги (обратите внимание, что нет никакого реального значения для «аргументов» или «флагов», я просто использую эти термины, чтобы разделить, принимают ли они значения или нет - все они находятся в одной карте).
И список, содержащий эти параметры (обратите внимание, что начальный дефис сохранен) - param1 - -param2
4) прибыль?
Другие примеры см. в прилагаемых модульных тестах.
Отказ от ответственности: я являюсь автором FeSimpleArgs
compile
, Pattern
которые никогда не меняются, tokenize2
никогда не используются и так далее. Возможно, вы захотите опубликовать вопрос на CodeReview.SE .Я успешно использовал args4j в ряде проектов. Он был разработан Kohsuke Kawaguchi , который также разработал Jenkins, был главным разработчиком JAXB и других проектов, поэтому у него очень хорошая родословная.
String[]
и вернуть (например) с Map
параметрами, а не что-то, что автоматически анализирует и назначает параметры из аргументов, переданных в jarfile . Кроме того, он должен быть в состоянии сказать мне, какие параметры были переданы с какими аргументами, в отличие от того, чтобы я говорил ему, какие параметры искать.Примечание. Этот ответ устарел, потому что OP отредактировал вопрос, добавив требование, которое это не выполняет (однако это все равно чертовски полезно знать). Смотрите комментарии ниже. ОП НЕ хочет, чтобы вы отрицали этот ответ.
Классикой для этого в Unix/Linux, еще со времен C, была GetOpt().
У Gnome есть порт Java здесь .
String
и enum , или Predicate<T>
, или что-то.пикокли могут представлять интерес. Это единый исходный файл, который побуждает авторов приложений командной строки включать его в качестве исходного кода в качестве более простой альтернативы затенению jar-файлов в uberjar. Он также выполняет все другие требования, изложенные в OP - UPDATE: за исключением требования о том, что параметры не могут быть исправлены во время компиляции :-(.
ОБНОВЛЕНИЕ 2: picocli 3.x предлагает программный API в дополнение к API аннотаций, так что теперь он отвечает всем требованиям. Обратите внимание, что Groovy CliBuilder основан на picocli, начиная с Groovy 2.5. Это именно то, о чем просит OP: динамически добавлять параметры и позиционные параметры в команду.
Недавно в него была добавлена функция автозаполнения.
Еще одна функция, которая может вам понравиться, — это цветная справка по использованию.
Возможности парсера:
<command> -xvfInputFile
а также <command> -x -v -f InputFile
) и длинные параметры GNU"1..*"
,"3..5"
Сообщение справки по использованию легко настроить с помощью аннотаций (без программирования). Например:
( источник )
Я не мог не добавить еще один скриншот, чтобы показать, какие справочные сообщения об использовании возможны. Справка по использованию — это лицо вашего приложения, так что будьте изобретательны и получайте удовольствие!
Отказ от ответственности: я создал пикокли. Обратная связь или вопросы очень приветствуются.
a_horse_with_no_name
Ник
CPerkins
works like getopt
" - ваше второе требование.Ник
CPerkins
Ник
-n "foo bar baz"
будет обрабатываться как флагn
с параметромfoo bar baz
, а неn
с параметром"foo
и двумя аргументами,bar
иbaz"
.Ник
CPerkins
-n foo bar baz
? С кавычками понятно, что вы хотите. Наверное, я спрашиваю, всегда ли пробел является разделителем.Ник
CPerkins