Как анализировать аргументы командной строки в 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.

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



Я использовал 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 кластеризованные короткие параметры (<command> -xvfInputFile а также <command> -x -v -f InputFile)
  • модель arity, которая позволяет минимальное, максимальное и переменное число параметров, e.g,"1..*", "3..5"
  • подкоманды (могут быть вложены в произвольную глубину)
  • работает с Java 5 и выше!--23-->

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

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.


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


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

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


Если вы хотите что-то легкое (размер банки ~ 20 кб) и простое в использовании, вы можете попробовать


Argparse4j-лучшее, что я нашел. Он имитирует argparse libary 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

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