Библиотека Java для анализа параметров командной строки?

Я пишу небольшое командное приложение на Java. Это приложение должно работать с сочетанием параметров и команд, аналогичных svn.


<сильные > Примеры

app url command1
app url command2 --parameter2 -x
app url command1 --param-with-argument argument
app --parameter url command1
app --no-url command2
app --help


Требуются

  • Существует простая в использовании библиотека для Java
  • Поддерживает синтаксический анализ таких команд
  • (Бонус) Автоматически создает соответствующую помощь

Ответ 1

Я поклонник Commons CLI.

Вы можете настроить его для понимания команд, флагов (с короткими и длинными именами), независимо от того, нужны или нет определенные команды/переключатели или имеют значения по умолчанию. Он даже имеет функциональность для распечатки полезного сообщения типа --help.

На странице

Ответ 2

Попробуйте args4j: http://args4j.kohsuke.org

Я предпочитаю args4j для Commons CLI. (И я использовал оба.)

С args4j вам не нужно вызывать какие-либо функции. Все сделано для вас! (Параметры устанавливаются в поле объекта через отражение.)

Ответ 3

Здесь относительно свежий (по состоянию на август 2017 г.) список библиотек, которые отвечают на ваш вопрос.

Если вы ищете рекомендацию, я рекомендую JOpt Simple или JewelCli.

Ответ 4

JewelCLI - это Java-библиотека для синтаксического анализа командной строки, которая дает чистый код. Он использует Проксированные интерфейсы, сконфигурированные с помощью аннотаций, для динамического создания API-интерфейса с поддержкой типа для параметров командной строки.

Пример интерфейса параметров Person.java:

import uk.co.flamingpenguin.jewel.cli.Option;

public interface Person {
    @Option String getName();
    @Option int getTimes();
}

Пример использования интерфейса параметров Hello.java:

import static uk.co.flamingpenguin.jewel.cli.CliFactory.parseArguments;
import uk.co.flamingpenguin.jewel.cli.ArgumentValidationException;

public class Hello {
    public static void main(String [] args) {
        try {
            Person person = parseArguments(Person.class, args);
            for (int i = 0; i < person.getTimes(); i++)
                System.out.println("Hello " +  person.getName());
        } catch(ArgumentValidationException e) {
            System.err.println(e.getMessage());
        }
    }
}

Сохраните копии вышеуказанных файлов в один каталог и загрузите JewelCLI 0.7.6 JAR в этот каталог также.

Скомпилируйте и запустите пример в Bash в Linux/Mac OS X/etc.:

javac -cp jewelcli-0.7.6.jar:. Person.java Hello.java
java -cp jewelcli-0.7.6.jar:. Hello --name="John Doe" --times=3

Скомпилируйте и запустите пример в командной строке Windows:

javac -cp jewelcli-0.7.6.jar;. Person.java Hello.java
java -cp jewelcli-0.7.6.jar;. Hello --name="John Doe" --times=3

Запуск примера должен приводить к следующему выводу:

Hello John Doe
Hello John Doe
Hello John Doe

Ответ 5

Для полноты использования добавьте JCommander https://github.com/cbeust/jcommander

public class JCommanderTest {
    @Parameter
    public List<String> parameters = Lists.newArrayList();

    @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity")
    public Integer verbose = 1;

    @Parameter(names = "-groups", description = "Comma-separated list of group names to be run")
    public String groups;

    @Parameter(names = "-debug", description = "Debug mode")
    public boolean debug = false;
}

и пример использования

CommanderTest jct = new JCommanderTest();
String[] argv = { "-log", "2", "-groups", "unit", "a", "b", "c" };
new JCommander(jct, argv);

Assert.assertEquals(jct.verbose.intValue(), 2);

Ответ 6

Также стоит посмотреть - jopt-simple.

Он пытается соблюдать синтаксисы опций командной строки POSIX getopt() и GNU getopt_long(). ' Кажется, что у него какое-то отношение к сообществу, особенно в командной строке, анализирующей lib для выбора OpenJDK (и Minecraft!).

Ответ 7

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

Чтобы использовать его, добавьте

<dependency>
    <groupId>com.github.jankroken</groupId>
    <artifactId>commandline</artifactId>
    <version>1.7.0</version>
</dependency>

вашему pom и объявите доступные параметры следующим образом:

public class CommandOptions {
  private List<String> commands = null;
  private boolean parameter = false;
  private boolean url = true;
  private boolean help = false;

  @LooseArguments
  public void setCommands(List<String> commands) {
    this.commands = commands;
  }

  @LongSwitch("parameter")
  @Toggle(true)
  public void setParameter(boolean parameter) {
    this.parameter=parameter;
  }

  @LongSwitch("noURL")
  @Toggle(false)
  public void setUrl(boolean url) {
    this.url = url;
  }

  @longSwitch("help")
  @Toggle(true)
  public void setHelp(boolean help) {
    this.help = help;
  }

  // getters
}

а затем для фактического анализа командной строки, выполните

public final static void main(String[] args) {
  try {
    CommandOptions options = CommandLineParser.parse(CommandOptions.class, args, OptionStyle.SIMPLE);

    // and then you can pass options to your application logic...

  } catch
    ...
  }
}

Обратите внимание, что он еще не содержит автоматически сгенерированный текст справки. Это было прототипировано, но прервано. Легко создать базовый текст справки для простых случаев, но для более сложных конфигураций (ae доступные параметры для приложения, такие как "find" или "gcc" ), результат будет не очень приятным, и вы скорее всего захотите самостоятельно управляйте макетом.

Ответ 9

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

https://github.com/airlift/airline

Простая зависимость Maven, которую нужно добавить:

<dependency>
    <groupId>io.airlift</groupId>
    <artifactId>airline</artifactId>
    <version>0.6</version>
</dependency>

И после этого он основан на аннотации и имеет довольно аккуратный способ отображения текста справки.

Здесь можно увидеть пример, если это полезно:

https://github.com/mneedham/neo4j-web-importer/blob/master/src/main/java/org/neo4j/dataimport/Neo4jImporter.java