20 ответов:
недавняя восходящая звезда picocli (цвета ANSI, автозаполнение командной строки, аннотации и программный API и многое другое).
также проверьте их (старше):
или ролл собственные:
например, вот как вы используете
commons-cliдля разбора 2 аргумента строку:import org.apache.commons.cli.*; public class Main { public static void main(String[] args) throws Exception { Options options = new Options(); Option input = new Option("i", "input", true, "input file path"); input.setRequired(true); options.addOption(input); Option output = new Option("o", "output", true, "output file"); output.setRequired(true); options.addOption(output); CommandLineParser parser = new DefaultParser(); HelpFormatter formatter = new HelpFormatter(); CommandLine cmd; try { cmd = parser.parse(options, args); } catch (ParseException e) { System.out.println(e.getMessage()); formatter.printHelp("utility-name", options); System.exit(1); } String inputFilePath = cmd.getOptionValue("input"); String outputFilePath = cmd.getOptionValue("output"); System.out.println(inputFilePath); System.out.println(outputFilePath); } }использование из командной строки:
$> java -jar target/my-utility.jar -i asd Missing required option: o usage: utility-name -i,--input <arg> input file path -o,--output <arg> output file
взгляните на более поздние JCommander.
Я создал его. Я рад получить вопросы или пожелания.
Я пытался поддерживать список парсеров JAVA CLI.
- авиакомпании
- Активная Вилка: https://github.com/rvesse/airline
- argparse4j
- argparser
- args4j
- clajr
- cli-parser
- CmdLn
- командная строка
- DocOpt.java
- Дельфин getopt
- DPML CLI (Jakarta Commons cli2 fork)
- Д-Р Маттиас Ло
- Jakarta Commons Кли
- jargo
- jargp
- jargs
- java-getopt
- jbock
- JCLAP
- jcmdline
- jcommander
- jcommando
- jewelcli (написано мной)
- JOpt simple
- jsap
- naturalcli
- статья Object Mentor CLI (подробнее о рефакторинге и TDD)
- parse-cmd
- ritopt
- Rop
- команда TE-кода
- picocli есть стандарт ANSI раскрашенная помочь использование и автозаполнение
Я использовал JOpt и нашел его довольно удобным:http://jopt-simple.sourceforge.net/
на первой странице также представлен список из 8 альтернативных библиотек, проверьте их и выберите тот, который наиболее соответствует вашим потребностям.
кто-то указал мне на args4j в последнее время, который основан на аннотации. Мне это очень нравится!
это библиотека синтаксического анализа командной строки Google с открытым исходным кодом в рамках проекта Bazel. Лично я думаю, что это лучший из них, и гораздо проще, чем Apache CLI.
https://github.com/pcj/google-options
установка
Базел
maven_jar( name = "com_github_pcj_google_options", artifact = "com.github.pcj:google-options:jar:1.0.0", sha1 = "85d54fe6771e5ff0d54827b0a3315c3e12fdd0c7", )ш
dependencies { compile 'com.github.pcj:google-options:1.0.0' }Maven
<dependency> <groupId>com.github.pcj</groupId> <artifactId>google-options</artifactId> <version>1.0.0</version> </dependency>использование
создать класс, который расширяет
OptionsBaseи определяет@Option(s).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. */ public class ServerOptions extends OptionsBase { @Option( name = "help", abbrev = 'h', help = "Prints usage info.", defaultValue = "true" ) public boolean help; @Option( name = "host", abbrev = 'o', help = "The server host.", category = "startup", defaultValue = "" ) public String host; @Option( name = "port", abbrev = 'p', help = "The server port.", category = "startup", defaultValue = "8080" ) public int port; @Option( name = "dir", abbrev = 'd', help = "Name of directory to serve static files.", category = "startup", allowMultiple = true, defaultValue = "" ) public List<String> dirs; }проанализируйте Аргументы и используйте их.
package example; import com.google.devtools.common.options.OptionsParser; import java.util.Collections; public class Server { public static void main(String[] args) { OptionsParser parser = OptionsParser.newOptionsParser(ServerOptions.class); parser.parseAndExitUponError(args); ServerOptions options = parser.getOptions(ServerOptions.class); if (options.host.isEmpty() || options.port < 0 || options.dirs.isEmpty()) { printUsage(parser); return; } System.out.format("Starting server at %s:%d...\n", options.host, options.port); for (String dirname : options.dirs) { System.out.format("\--> Serving static files at <%s>\n", dirname); } } private static void printUsage(OptionsParser parser) { System.out.println("Usage: java -jar server.jar OPTIONS"); System.out.println(parser.describeOptions(Collections.<String, String>emptyMap(), OptionsParser.HelpVerbosity.LONG)); } }
посмотри Commons CLI проект, там много хороших вещей.
может быть, эти
- picocli "могучий крошечный интерфейс командной строки". Picocli-это библиотека синтаксического анализатора аргументов командной строки для Java - с цветной справкой по использованию ANSI и завершением командной строки. Вложенные подкоманды, подробное руководство пользователя и возможность включать в качестве источника, чтобы избежать зависимости от jar picocli также заслуживают внимания.
разбор параметров командной строки JArgs люкс для Java - этот крошечный проект обеспечивает удобный, компактный, предварительно упакованный и всесторонне документированный набор анализаторов параметров командной строки для использования программистами Java. Изначально предусмотрен парсинг, совместимый с GNU-стилем "getopt".
ritopt, конечный парсер опций для Java - хотя было предложено несколько стандартов параметров командной строки, ritopt следует соглашениям, предписанным в пакете opt.
да.
Я думаю, что вы ищете что-то вроде этого: http://commons.apache.org/cli
библиотека CLI Apache Commons предоставляет API для обработки интерфейсов командной строки.
вы можете найти эту мета-статью несчастья интересной в качестве точки прыжка:
http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html
купить или построить?
многие небольшие утилиты, как приложения, вероятно, свернуть свой собственный синтаксический анализ командной строки, чтобы избежать дополнительной внешней зависимости.
picocli может быть интересно. Он предназначен для включения в качестве источника в качестве более простой альтернативы затенения банок в uberjar.
еще одна функция, которая вам может понравиться, - это ее раскрашенная справка по использованию.
парсер особенности:
- аннотация на основе: разбор-это одна строка кода
- строго типизированные все-параметры командной строки, а также позиционные параметры
- POSIX clustered short options (
<command> -xvfInputFileа также<command> -x -v -f InputFile)- модель arity, которая позволяет минимальное, максимальное и переменное число параметров, например,
"1..*","3..5"- подкоманды (могут быть вложены на произвольную глубину)
- работает с Java 5 и выше
сообщение справки по использованию легко настроить с помощью аннотаций (без программирования). Например:
(источник)
Я не мог удержаться от добавления еще одного скриншота, чтобы показать, какие сообщения справки об использовании возможны. Справка по использованию-это лицо вашего приложения, поэтому будьте изобретательны и получайте удовольствие!
отказ от ответственности: я создал picocli. Обратная связь или вопросы очень приветствуются.
Я написал еще один: http://argparse4j.sourceforge.net/
Argparse4j-это библиотека синтаксического анализатора аргументов командной строки для Java, основанная на argparse Python.
Если вы знакомы с gnu getopt, есть порт Java по адресу:http://www.urbanophile.com/arenn/hacking/download.htm.
есть некоторые классы, которые делают это:
авиакомпания @ Github выглядит хорошо. Он основан на аннотации и пытается эмулировать структуры командной строки Git.
Я бы не рекомендовал использовать библиотеку Apache Common CLI, поскольку она не является потокобезопасной. Он использует статические классы со статическими переменными и методы для выполнения внутренней работы (например, OptionBuilder) и должен использоваться только в однопоточных строго контролируемых ситуациях.
Я знаю, что большинство людей здесь найдут 10 миллионов причин, почему им не нравится мой путь, но неважно. Мне нравится держать вещи простыми, поэтому я просто отделяю ключ от значения с помощью ' = ' и сохраняю их в хэш-карте следующим образом:
Map<String, String> argsMap = new HashMap<>(); for (String arg: args) { String[] parts = arg.split("="); argsMap.put(parts[0], parts[1]); }вы всегда можете вести список с аргументами, которые вы ожидаете, чтобы помочь пользователю в случае, если он забыл аргумент или использовал неправильный... Однако, если вы хотите слишком много функций, это решение не для тебя.
Если вы хотите что-то легкое (размер банки ~ 20 кб) и простое в использовании, вы можете попробовать
Argparse4j-это лучшее, что я нашел. Он имитирует библиотеку argparse Python, которая очень удобна и мощна.
как один из комментариев, упомянутых ранее (https://github.com/pcj/google-options) было бы хорошим выбором для начала.
одна вещь, которую я хочу добавить:
1) Если вы столкнулись с какой-то ошибкой отражения парсера, попробуйте использовать более новую версию guava. в моем случае:
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 something3) Когда вам нужна помощь по использованию, просто введите:
bazel run path/to/your:project -- --help
для весенних пользователей, мы должны упомянуть также 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



Comments