Как разобрать аргументы командной строки в Java?



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

1322   20  

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.

Я создал его. Я рад получить вопросы или пожелания.

Я использовал 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));
  }

}

https://github.com/pcj/google-options

посмотри 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.

еще одна функция, которая вам может понравиться, - это ее раскрашенная справка по использованию.

Minimal usage help with ANSI colors

парсер особенности:

  • аннотация на основе: разбор-это одна строка кода
  • строго типизированные все-параметры командной строки, а также позиционные параметры
  • POSIX clustered short options (<command> -xvfInputFile а также <command> -x -v -f InputFile)
  • модель arity, которая позволяет минимальное, максимальное и переменное число параметров, например,"1..*","3..5"
  • подкоманды (могут быть вложены на произвольную глубину)
  • работает с Java 5 и выше

сообщение справки по использованию легко настроить с помощью аннотаций (без программирования). Например:

Extended usage help message (источник)

Я не мог удержаться от добавления еще одного скриншота, чтобы показать, какие сообщения справки об использовании возможны. Справка по использованию-это лицо вашего приложения, поэтому будьте изобретательны и получайте удовольствие!

picocli demo

отказ от ответственности: я создал 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 something

3) Когда вам нужна помощь по использованию, просто введите:

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

    Ничего не найдено.