Как анализировать аргументы командной строки в Java?
Что это хороший способ разбора аргументов командной строки в Java?
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 простые
- jsap
- naturalcli
- статья CLI наставника объекта (больше о рефакторинге и TDD)
- parse-cmd
- ritopt
- РОП
- 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));
}
}
может быть, эти
- 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 кластеризованные короткие параметры (
<command> -xvfInputFile
а также<command> -x -v -f InputFile
) - модель arity, которая позволяет минимальное, максимальное и переменное число параметров, e.g,
"1..*"
,"3..5"
- подкоманды (могут быть вложены в произвольную глубину)
- работает с Java 5 и выше!--23-->
сообщение справки использования легко настроить с аннотациями (без программирования). Например:
(источник)
Я не мог удержаться от добавления еще одного скриншота, чтобы показать, какие сообщения справки по использованию возможны. Помощь по использованию-это лицо вашего приложения, поэтому будьте изобретательны и получайте удовольствие!
отказ от ответственности: я создал picocli. Обратная связь или вопросы очень приветствуются.
Я написал еще одно: http://argparse4j.sourceforge.net/
Argparse4j-это библиотека синтаксического анализатора аргументов командной строки для Java, основанная на argparse Python.
Если вы знакомы с gnu getopt, есть порт Java по адресу:http://www.urbanophile.com/arenn/hacking/download.htm.
есть некоторые классы, которые делают это:
авиакомпания @ Github выглядит хорошо. Он основан на аннотации и пытается эмулировать структуры командной строки Git.
Я бы не рекомендовал использовать общую библиотеку CLI Apache, поскольку она не является потокобезопасной. Он использует классы со статическими переменными и методы для выполнения внутренней работы (например, OptionBuilder) и должен использоваться только в однопоточных строго контролируемых ситуациях.
Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
String[] parts = arg.split("=");
argsMap.put(parts[0], parts[1]);
}
вы всегда можете поддерживать список с ожидаемыми аргументами, чтобы помочь пользователю в случае, если он забыл аргумент или использовал неправильный... Однако, если вы хотите слишком много функций, это решение не для тебя.
Если вы хотите что-то легкое (размер банки ~ 20 кб) и простое в использовании, вы можете попробовать
как один из комментариев, упомянутых ранее (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 something
3) Когда вам нужна помощь по использованию, просто введите:
bazel run path/to/your:project -- --help
для пользователей 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