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

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

Ответы [ 20 ]

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

Проверьте это:

Или сверните свое собственное:


Например, это то, как вы используете 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
294 голосов
/ 26 июля 2010

Взгляните на более свежий JCommander .

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

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

Я использовал JOpt и нашел его очень удобным: http://jopt -simple.sourceforge.net /

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

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

Кто-то недавно указал мне на args4j , основанный на аннотациях. Мне действительно это нравится!

11 голосов
/ 04 мая 2017

Купить или построить?

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

picocli может быть интересным. Он предназначен для включения в качестве источника в качестве более простой альтернативы теневым банкам в uberjar.

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

Minimal usage help with ANSI colors

Возможности парсера:

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

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

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

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

picocli demo

Отказ от ответственности: я создал picocli. Отзывы или вопросы очень приветствуются.

9 голосов
/ 07 декабря 2016

Это библиотека синтаксического анализа командной строки 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",
)

Gradle

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

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

Посмотрите на проект Commons CLI , там много хороших вещей.

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

Yeap.

Я думаю, вы ищете что-то вроде этого: http://commons.apache.org/cli

Библиотека CLI Apache Commons предоставляет API для обработки интерфейсов командной строки.

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

Может быть, это

  • Разбор параметров командной строки JArgs пакет для Java - этот крошечный проект предоставляет удобный, компактный, предварительно упакованный и полностью документированный набор анализаторов параметров командной строки для использования программистами Java. Первоначально, синтаксический анализ совместим с GNU-стилем 'getopt'.

  • ritopt, анализатор окончательных параметров для Java - Несмотря на то, что было предложено несколько стандартов параметров командной строки, ritopt следует соглашениям, предписанным в пакете opt.

...