Как мне разобрать аргументы командной строки в Java? - PullRequest
522 голосов
/ 15 декабря 2008

Каков хороший способ анализа аргументов командной строки в Java?

Ответы [ 20 ]

6 голосов
/ 15 декабря 2008

Вы можете найти эту мета-статью несчастья интересной в качестве отправной точки:

http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html

5 голосов
/ 04 сентября 2012

Я написал еще одну: http://argparse4j.sourceforge.net/

Argparse4j - это библиотека синтаксического анализа аргументов командной строки для Java, основанная на Python argparse.

5 голосов
/ 15 декабря 2008

Если вы знакомы с gnu getopt, существует порт Java по адресу: http://www.urbanophile.com/arenn/hacking/download.htm.

Кажется, есть некоторые классы, которые делают это:

4 голосов
/ 09 апреля 2013

авиакомпания @ Github выглядит хорошо. Он основан на аннотации и пытается эмулировать структуры командной строки Git.

3 голосов
/ 19 июля 2018

Я знаю, что большинство людей здесь найдут 10 миллионов причин, почему им не нравится мой путь, но не берите в голову. Мне нравится делать вещи простыми, поэтому я просто отделяю ключ от значения, используя '=', и сохраняю их в HashMap следующим образом:

Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
    String[] parts = arg.split("=");
    argsMap.put(parts[0], parts[1]);
} 

Вы всегда можете вести список с ожидаемыми аргументами, чтобы помочь пользователю в случае, если он забыл аргумент или использовал неправильный ... Однако, если вам нужно слишком много функций, это решение в любом случае не для вас.

2 голосов
/ 26 августа 2017

Если вы хотите что-то более легкое (размер банки ~ 20 кб) и простое в использовании, вы можете попробовать аргумент-парсер . Он может использоваться в большинстве случаев, поддерживает указание массивов в аргументе и не зависит от какой-либо другой библиотеки. Это работает для Java 1.5 или выше. Ниже приведен пример того, как его использовать:

public static void main(String[] args) {
    String usage = "--day|-d day --mon|-m month [--year|-y year][--dir|-ds directoriesToSearch]";
    ArgumentParser argParser = new ArgumentParser(usage, InputData.class);
    InputData inputData = (InputData) argParser.parse(args);
    showData(inputData);

    new StatsGenerator().generateStats(inputData);
}

Больше примеров можно найти здесь

2 голосов
/ 29 августа 2012

Я бы не рекомендовал использовать библиотеку Apache Common CLI, так как она не поддерживает потоки. Он использует классы с состоянием со статическими переменными и методами для выполнения внутренней работы (например, OptionBuilder) и должен использоваться только в однопоточных строго контролируемых ситуациях.

1 голос
/ 18 октября 2017

Argparse4j - лучшее, что я нашел. Он имитирует argparse-библиотеку Python, которая очень удобна и мощна.

0 голосов
/ 21 сентября 2018

Для пользователей 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

0 голосов
/ 26 августа 2018

Как один из упомянутых ранее комментариев (https://github.com/pcj/google-options) будет хорошим выбором для начала.

Одна вещь, которую я хочу добавить:

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) Если вам нужна помощь в использовании, просто наберите:

bazel run path/to/your:project -- --help
...