Похоже, я довольно опоздал на эту вечеринку, но я написал обработчик аргументов командной строки для Java и поместил его в GitHub: MainArgsHandler . Что касается закрытия потока, я думаю, что это очень полезный поток, но, возможно, его следует перенести на сайт программистов Stack Exchange для общего обсуждения программирования.
Великолепно
@RedGlyph - похоже, SO / SE нужно упростить свои правила. Этот вопрос должен быть: How to parse java command line arguments?. Но никто действительно не хочет писать код для этого, а использовать инструмент. Но поиск инструментов и подобных
вещей
6
Проголосовал за открытие. @AlikElzin: Действительно, им нужно пересмотреть процесс модерирования. Я подозреваю, что есть значок для закрытия очень многих вопросов, и это заманивает желающих быть модераторами слишком усердными.
RedGlyph
8
Этот вопрос является приманкой для плохих / однострочных ответов и рекомендаций инструмента. Он должен оставаться закрытым.
Обратите внимание, что в отличие от многих других библиотек Apache, Apache CLI не имеет зависимостей.
Владимир Дюжев
9
Единственным недостатком многих проектов Apache-Commons является то, что они получают все меньше и меньше коммитов и в конечном итоге оказываются устаревшими.
Бретт Райан
4
Вот страница «Сценарии использования» для проекта Apache CLI, в которой подробно рассказывается, как быстро начать его использовать: commons.apache.org/cli/usage.html
Брэд Паркс,
Я не думаю, что есть такой же, как Args4J / JCommander, кроме случаев, когда вы определяете интерфейс и комментируете методы? Я никогда не был в состоянии полюбить классы, которые "жутко инициализируют" частные поля ...
Trejkaz
5
@RemkoPopma, ваша библиотека picocli выглядит просто великолепно, и спасибо вам за это, правда. Но я считаю, что вы делаете здесь и в других постах (редактируйте принятые ответы и рекламируйте свою библиотеку в верхней части страницы, даже не раскрывая, что это редактирование не от оригинального автора поста и это ваша библиотека), ужасно ужасное злоупотребление вашими полномочиями модерирования. Отметить это для других модов.
Рад, что вам нравится JCommander :-) Я не хотел добавлять слишком много семантики к тому, как обрабатываются флаги, поэтому вам просто нужно добавить синонимы в используемых вами аннотациях: @Parameter (names = {"-h", "- -помощь "}) Я думал, что это разумный компромисс.
Седрик Бест
14
Отличный инструмент. Мощный, гибкий, и вам не нужно иметь дело с раздражающими, традиционными парсерами опций.
Ян Гилхэм
3
Да, я думаю, что написал бы мой собственный анализатор аргументов командной строки точно так же, как вы написали JCommander. Отличная работа.
SRG
9
@CedricBeust, это замечательная библиотека, я вам очень благодарен. Поскольку мы можем определять наши собственные классы Args, которые затем можно передавать без какой-либо зависимости от класса библиотек, это делает его чрезвычайно гибким.
@ Бен Флинн хе-хе, там есть несколько довольно удивительных и интересных колес в форме. Я думаю, это в основном безвредный способ показать, что есть гораздо больше, чем один способ сделать это!
lexicalscope
14
Отмечу, что автор JOpt Simple поддерживает очень похожий список! Нам нужен текст, чтобы превратить эти списки в таблицу со списком функций и достопримечательностей, чтобы мы, бедные пользователи, могли сделать осознанный выбор.
Том Андерсон
1
Я создал Rop - github.com/ryenus/rop , в котором реализовано решение на основе аннотаций, в котором вы объявляете команды и параметры через простые классы и поля, в значительной степени декларативный способ создания анализаторов командной строки. он может создавать приложения типа Git (single-cmd) или Maven (multi-cmd).
ryenus
8
Большинство перечисленных проектов по сути являются заброшенными. Пройдя по списку, я бы сказал, что крупные нападающие, которые активно поддерживаются и популярны, кажутся commons-cli, jcommander, args4j, jopt-simple и picocli. Извиняюсь перед авторами таких вещей, как argparse4j и cli-parser - мне пришлось сделать несколько произвольное ранжирование, и я выбрал пятерку, очевидно, что другие проекты в списке популярны и все еще находятся в активной разработке.
Джордж Хокинс
2
Я призываю кого-то включить дату последнего стабильного выпуска каждого парсера.
Санки
50
Это 2020 год, время, чтобы сделать лучше, чем CLI Commons ... :-)
Должны ли вы создать свой собственный анализатор командной строки Java или использовать библиотеку?
Многие небольшие подобные приложения, вероятно, запускают собственный синтаксический анализ командной строки, чтобы избежать дополнительной внешней зависимости. Picocli может быть интересной альтернативой.
Picocli - это современная библиотека и инфраструктура для удобного создания мощных, удобных для пользователя приложений с поддержкой GraalVM. Он находится в 1 исходном файле, поэтому приложения могут включать его в качестве источника, чтобы избежать добавления зависимости.
Он поддерживает цвета, автозаполнение, подкоманды и многое другое. Написано на Java, доступно из Groovy, Kotlin, Scala и т. Д.
Особенности:
Основанный на аннотации: декларативный , избегает дублирования и выражает намерение программиста
Удобно: анализировать пользовательский ввод и запускать бизнес-логику с помощью одной строки кода
Все строго набрано - параметры командной строки, а также позиционные параметры
Детальное управление : модель арности, которая допускает минимальное, максимальное и переменное количество параметров, например "1..*","3..5"
Подкоманды (могут быть вложены на произвольную глубину)
Многофункциональный : составные группы аргументов, разбиение аргументов в кавычках, повторяемые подкоманды и многое другое
Удобный для пользователя : в справочном сообщении об использовании используются цвета для контрастирования важных элементов, таких как имена опций, от остальной части использования, которые помогают снизить когнитивную нагрузку на пользователя
Я не мог удержаться от добавления еще одного скриншота, чтобы показать, какие сообщения об использовании возможны. Справка по использованию - это лицо вашего приложения, так что будьте изобретательны и получайте удовольствие!
Отказ от ответственности: я создал picocli. Отзывы или вопросы очень приветствуются.
Чистый гений! Обидно, этот ответ похоронен внизу. Apache Commons CLI является многословным, содержит ошибки и давно не обновлялся. И я не хочу использовать синтаксический анализатор CLI от Google, потому что я не хочу целевых рекламных объявлений, основанных на моей истории использования аргументов командной строки. Но все равно выглядит немного более многословно, чем пикокли.
Пит
2
Я второй @ Пит здесь ... Я прошел список выше, который был пустой тратой времени с этим, похороненным внизу. Это должен быть главный ответ на милю. Отличная работа! Мои требования не могут быть покрыты Apache CLI или большинством других парсеров. Они бросали вызов даже для picocli, но он был в состоянии дать мне наиболее близкую вещь к синтаксису / поведению, которое я хотел, и был достаточно гибок, чтобы взломать то, что мне действительно нужно. В качестве бонуса это здорово смотрится благодаря материалу ANSI.
Shai
@ShaiAlmog Ответ с самым высоким рейтингом - 10 лет и он устарел. Я согласен, что рекомендация CLI Commons в 2019 году вводит в заблуждение ИМХО. Пожалуйста, подумайте над тем, чтобы переписать лучший ответ, чтобы сделать его более актуальным.
Ремко
Я вижу, вы уже пробовали это, я не думаю, что это будет работать и для меня ... Если бы вы выбрали имя, такое как 1Picoli, мы могли бы отсортировать третий ответ по алфавиту ;-)
Shai
Я думаю, что причина моего изменения была в том, что я не раскрыл свою принадлежность (что я автор). У других людей не должно быть этой проблемы.
На главной странице также представлен список из 8 альтернативных библиотек, посмотрите их и выберите ту, которая больше всего соответствует вашим потребностям.
+1 для Args4J! Чрезвычайно дружелюбный, гибкий и понятный. Я думаю, что это должна быть стандартная библиотека для создания приложений Java CLI.
Зерин
Замечательно, что он может обрабатывать неупорядоченные (отсортированные по полевому порядку) печати, что не может JCommander, и он более гибкий.
Даниэль Хари
@ DanielHári Только для информации, эта функциональность была добавлена в JCommander (где-то в конце февраля 2017 года).
Натан
9
Это библиотека синтаксического анализа командной строки Google, открытая как часть проекта Bazel. Лично я считаю, что он лучший и намного проще, чем Apache CLI.
Создайте класс, который расширяет OptionsBaseи определяет ваши @Option(и).
package example;import com.google.devtools.common.options.Option;import com.google.devtools.common.options.OptionsBase;import java.util.List;/**
* Command-line options definition for example server.
*/publicclassServerOptionsextendsOptionsBase{@Option(
name ="help",
abbrev ='h',
help ="Prints usage info.",
defaultValue ="true")publicboolean help;@Option(
name ="host",
abbrev ='o',
help ="The server host.",
category ="startup",
defaultValue ="")publicString host;@Option(
name ="port",
abbrev ='p',
help ="The server port.",
category ="startup",
defaultValue ="8080")publicint port;@Option(
name ="dir",
abbrev ='d',
help ="Name of directory to serve static files.",
category ="startup",
allowMultiple =true,
defaultValue ="")publicList<String> dirs;}
Привет, Пол. Когда я читаю ваш ответ или документацию вашего проекта, я не имею ни малейшего представления, с какой командной строкой он может работать. Например, вы можете предоставить что-то вроде myexecutable -c file.json -d 42 --outdir ./out. И я не вижу, как вы определяете короткие / длинные / описания параметров ... Ура
olibre
8
Взгляните на проект Commons CLI , там много хорошего.
Я знаю, что большинство людей здесь найдут 10 миллионов причин, почему им не нравится мой путь, но не берите в голову. Мне нравится делать вещи простыми, поэтому я просто отделяю ключ от значения, используя '=', и сохраняю их в HashMap следующим образом:
Map<String,String> argsMap =newHashMap<>();for(String arg: args){String[] parts = arg.split("=");
argsMap.put(parts[0], parts[1]);}
Вы всегда можете вести список с ожидаемыми аргументами, чтобы помочь пользователю в случае, если он забыл аргумент или использовал неправильный ... Однако, если вам нужно слишком много функций, это решение в любом случае не для вас.
Набор синтаксического анализа параметров командной строки JArgs для Java - этот крошечный проект предоставляет удобный, компактный, предварительно упакованный и полностью документированный набор анализаторов параметров командной строки для использования программистами Java. Первоначально синтаксический анализ совместим с GNU-стилем getopt.
Этот парень довольно бесполезен: «Commons CLI. По-видимому, самый старый из предложенных здесь вариантов, и он не получает большого уважения от комментаторов, поэтому я не очень внимательно смотрю на это…», но все равно спасибо за ссылку.
Если вы уже используете Spring Boot, разбор аргументов происходит из коробки.
Если вы хотите запустить что-то после запуска, реализуйте ApplicationRunnerинтерфейс:
@SpringBootApplicationpublicclassApplicationimplementsApplicationRunner{publicstaticvoid main(String[] args){SpringApplication.run(Application.class, args);}@Overridepublicvoid run(ApplicationArguments args){
args.containsOption("my-flag-option");// test if --my-flag-option was set
args.getOptionValues("my-option");// returns values of --my-option=value1 --my-option=value2
args.getOptionNames();// returns a list of all available options// do something with your args}}
Ваш runметод будет вызван после успешного запуска контекста.
Если вам нужен доступ к аргументам до запуска контекста приложения, вы можете просто проанализировать аргументы приложения вручную:
@SpringBootApplicationpublicclassApplicationimplementsApplicationRunner{publicstaticvoid main(String[] args){ApplicationArguments arguments =newDefaultApplicationArguments(args);// do whatever you like with your arguments// see above ...SpringApplication.run(Application.class, args);}}
И наконец, если вам нужен доступ к вашим аргументам в бине, просто введите ApplicationArguments:
Если вы хотите что-то более легкое (размер банки ~ 20 кб) и простое в использовании, вы можете попробовать аргумент-парсер . Он может использоваться в большинстве случаев, поддерживает указание массивов в аргументе и не зависит от какой-либо другой библиотеки. Это работает для Java 1.5 или выше. Ниже приведен пример того, как его использовать:
Я бы не рекомендовал использовать Apache Common CLI библиотеку, так как она не является поточно-безопасной.
Он использует классы с состоянием со статическими переменными и методами для выполнения внутренней работы (например OptionBuilder) и должен использоваться только в однопоточных строго контролируемых ситуациях.
Следует помнить, что библиотека CLI не является поточно-ориентированной. Однако я бы предположил, что синтаксический анализ командной строки обычно выполняется в одном потоке во время запуска приложения, а затем, в зависимости от параметров, могут запускаться другие потоки.
1) Если вы столкнулись с ошибкой отражения парсера, попробуйте использовать более новую версию гуавы. в моем случае:
maven_jar(
name ="com_google_guava_guava",
artifact ="com.google.guava:guava:19.0",
server ="maven2_server",)
maven_jar(
name ="com_github_pcj_google_options",
artifact ="com.github.pcj:google-options:jar:1.0.0",
server ="maven2_server",)
maven_server(
name ="maven2_server",
url ="http://central.maven.org/maven2/",)
2) При запуске командной строки:
bazel run path/to/your:project ----var1 something --var2 something -v something
3) Если вам нужна помощь в использовании, просто введите:
How to parse java command line arguments?
. Но никто действительно не хочет писать код для этого, а использовать инструмент. Но поиск инструментов и подобныхОтветы:
Проверьте это:
Или сверните свое собственное:
Например, вот как вы используете
commons-cli
для анализа 2 строковых аргументов:использование из командной строки:
источник
Взгляните на более свежий JCommander .
Я создал это. Я рад получить вопросы или пожелания.
источник
Я пытался поддерживать список парсеров Java CLI .
источник
Должны ли вы создать свой собственный анализатор командной строки Java или использовать библиотеку?
Многие небольшие подобные приложения, вероятно, запускают собственный синтаксический анализ командной строки, чтобы избежать дополнительной внешней зависимости. Picocli может быть интересной альтернативой.
Picocli - это современная библиотека и инфраструктура для удобного создания мощных, удобных для пользователя приложений с поддержкой GraalVM. Он находится в 1 исходном файле, поэтому приложения могут включать его в качестве источника, чтобы избежать добавления зависимости.
Он поддерживает цвета, автозаполнение, подкоманды и многое другое. Написано на Java, доступно из Groovy, Kotlin, Scala и т. Д.
Особенности:
<command> -xvfInputFile
а также<command> -x -v -f InputFile
)"1..*"
,"3..5"
Справочное сообщение об использовании легко настроить с помощью аннотаций (без программирования). Например:
( источник )
Я не мог удержаться от добавления еще одного скриншота, чтобы показать, какие сообщения об использовании возможны. Справка по использованию - это лицо вашего приложения, так что будьте изобретательны и получайте удовольствие!
Отказ от ответственности: я создал picocli. Отзывы или вопросы очень приветствуются.
источник
Я использовал JOpt и нашел его очень удобным: http://jopt-simple.sourceforge.net/
На главной странице также представлен список из 8 альтернативных библиотек, посмотрите их и выберите ту, которая больше всего соответствует вашим потребностям.
источник
Кто-то недавно указал мне на args4j, основанный на аннотациях. Мне это и вправду нравится!
источник
Это библиотека синтаксического анализа командной строки Google, открытая как часть проекта Bazel. Лично я считаю, что он лучший и намного проще, чем Apache CLI.
https://github.com/pcj/google-options
Установка
Базэл
Gradle
специалист
Применение
Создайте класс, который расширяет
OptionsBase
и определяет ваши@Option
(и).Разбери аргументы и используй их.
https://github.com/pcj/google-options
источник
myexecutable -c file.json -d 42 --outdir ./out
. И я не вижу, как вы определяете короткие / длинные / описания параметров ... УраВзгляните на проект Commons CLI , там много хорошего.
источник
Yeap.
Я думаю, что вы ищете что-то вроде этого: http://commons.apache.org/cli
источник
Я знаю, что большинство людей здесь найдут 10 миллионов причин, почему им не нравится мой путь, но не берите в голову. Мне нравится делать вещи простыми, поэтому я просто отделяю ключ от значения, используя '=', и сохраняю их в HashMap следующим образом:
Вы всегда можете вести список с ожидаемыми аргументами, чтобы помочь пользователю в случае, если он забыл аргумент или использовал неправильный ... Однако, если вам нужно слишком много функций, это решение в любом случае не для вас.
источник
Может быть эти
Набор синтаксического анализа параметров командной строки JArgs для Java - этот крошечный проект предоставляет удобный, компактный, предварительно упакованный и полностью документированный набор анализаторов параметров командной строки для использования программистами Java. Первоначально синтаксический анализ совместим с GNU-стилем getopt.
ritopt, анализатор окончательных параметров для Java - хотя было предложено несколько стандартов параметров командной строки, ritopt следует соглашениям, предписанным в пакете opt.
источник
Вы могли бы найти эту мета-статью несчастья интересной как отправную точку:
http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html
источник
Я написал еще один: http://argparse4j.sourceforge.net/
Argparse4j - это библиотека анализатора аргументов командной строки для Java, основанная на argparse Python.
источник
Если вы знакомы с gnu getopt, есть порт Java по адресу: http://www.urbanophile.com/arenn/hacking/download.htm .
Кажется, есть некоторые классы, которые делают это:
источник
авиакомпания @ Github выглядит хорошо. Он основан на аннотации и пытается эмулировать структуры командной строки Git.
источник
Если вы уже используете Spring Boot, разбор аргументов происходит из коробки.
Если вы хотите запустить что-то после запуска, реализуйте
ApplicationRunner
интерфейс:Ваш
run
метод будет вызван после успешного запуска контекста.Если вам нужен доступ к аргументам до запуска контекста приложения, вы можете просто проанализировать аргументы приложения вручную:
И наконец, если вам нужен доступ к вашим аргументам в бине, просто введите
ApplicationArguments
:источник
Argparse4j - лучшее, что я нашел. Он имитирует argparse-библиотеку Python, которая очень удобна и мощна.
источник
Если вы хотите что-то более легкое (размер банки ~ 20 кб) и простое в использовании, вы можете попробовать аргумент-парсер . Он может использоваться в большинстве случаев, поддерживает указание массивов в аргументе и не зависит от какой-либо другой библиотеки. Это работает для Java 1.5 или выше. Ниже приведен пример того, как его использовать:
Больше примеров можно найти здесь
источник
Я бы не рекомендовал использовать
Apache Common CLI
библиотеку, так как она не является поточно-безопасной.Он использует классы с состоянием со статическими переменными и методами для выполнения внутренней работы (например
OptionBuilder
) и должен использоваться только в однопоточных строго контролируемых ситуациях.источник
Как один из упомянутых ранее комментариев ( https://github.com/pcj/google-options ), было бы хорошим выбором для начала.
Одна вещь, которую я хочу добавить:
1) Если вы столкнулись с ошибкой отражения парсера, попробуйте использовать более новую версию гуавы. в моем случае:
2) При запуске командной строки:
3) Если вам нужна помощь в использовании, просто введите:
источник
Для пользователей Spring следует также упомянуть https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/SimpleCommandLinePropertySource.html и его брата-близнеца https: //docs.spring .io / spring / docs / current / javadoc-api / org / springframework / core / env / JOptCommandLinePropertySource.html (реализация JOpt с той же функциональностью). Преимущество в Spring заключается в том, что вы можете напрямую связать аргументы командной строки с атрибутами, здесь есть пример https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/ CommandLinePropertySource.html
источник