Иерархия команд Picocli в JLine - PullRequest
1 голос
/ 06 июня 2019

Я использую Pico CLI v4.0.0-alpha-3 и jline v3. У меня есть следующий класс (с использованием аннотаций). Когда я запускаю основной класс, я не могу запустить команду и вызвать вызываемый объект. Я могу вызвать вызываемое, если просто передам параметры.

@CommandLine.Command(name = "Test CLI",
        description = "CLI tool",
        header = "%n@|green test cli |@",
        footer = {"",
                "@|cyan Press Ctrl-D to exit the CLI.|@",
                        ""},
        version = "1.0.0",
        showDefaultValues = true,
        optionListHeading = "@|bold %nOptions|@:%n",
        subcommands = {
                Sync.class,
                Status.class
    })
public class Tester implements Callable<Integer> {

    private static final String PROMPT = "Test CLI> ";

    private LineReaderImpl lineReader;
    private PrintWriter out;


    @Option(names = {"-u", "--username"}, required = true, description = "user name")
    private String userName;

    @Option(names = {"-p", "--password"}, required = true, description = "password")
    private String password;



   final Tester tester = new Tester();
    final CommandLine cmd = prepareCommand(tester);
    final int exitCode = cmd.execute(args);

Когда я запускаю приложение java и запускаю команду с параметрами, вызываемый объект не вызывается. Когда я просто передаю параметры, вызывается вызываемый объект. Любые мысли о том, как это исправить, чтобы пользователь CLI передавал команду с параметрами.

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Утилиты командной строки

Я думаю, что путаница, связанная с упаковкой java-приложений, вызывает путаницу.Если ваше приложение представляет собой один исполняемый файл, скажем, myapp.exe, то вы вызываете приложение из командной строки следующим образом:

myapp -u xxx

Если ваше приложение является классом Java, вам необходимо вызвать егонапример:

java -cp mylib.jar com.myorg.MyApp -u xxx

Итак, команда верхнего уровня - это сам класс com.myorg.MyApp, нет необходимости указывать myapp в качестве аргумента для класса com.myorg.MyApp вкомандная строка .

Теперь представьте, что ваше приложение myapp имеет подкоманду, называемую sub.Опять же, если ваше приложение было одним исполняемым файлом, вы бы вызвали подкоманду в командной строке следующим образом:

myapp sub --subcommand-options

Как класс Java, вам нужно вызвать его, как показано ниже.Обратите внимание, что здесь, вам do необходимо указать имя подкоманды в качестве аргумента командной строки для класса com.myorg.MyApp:

java -cp mylib.jar com.myorg.MyApp sub --subcommand-options

Примечание: люди часто создают сценарии запуска для Windows и Unix, которые позволяют выполнять ваше приложение как myapp вместо java -cp mylib.jar com.myorg.MyApp.Одна из причин, по которой люди с энтузиазмом относятся к GraalVM, заключается в том, что собственные изображения GraalVM решают эту проблему упаковки и позволяют разработчикам Java распространять свои приложения в виде одного исполняемого файла.

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

package com.myorg;

@Command(name = "myapp")
public class MyApp implements Runnable {

    @Option(names = {"-u", "--username"}, description = "user name")
    private String userName;

    @Command // subcommand "sub"
    public void sub(@Option(names = "--subcommand-options") String option)  {
        System.out.printf("sub says hello %s!%n", userName);
    }

    @Override
    public void run() {
        System.out.printf("myapp says hi %s!%n", userName);
    }

    public static void main(String[] args) {
        int exitCode = new CommandLine(new MyApp()).execute(args);

    }
}

Приложения интерактивной командной строки

Когда вы создаете приложение командной оболочки CLI с JLine,Вы должны иметь в виду, что команда верхнего уровня не указана в командной строке .

Следовательно, все команды, которые вы хотите, чтобы пользователи могли вводить в оболочке должно быть подкомандами , как вы описали в своем ответе.

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

1 голос
/ 07 июня 2019

Мне никогда не удавалось использовать имя команды после открытия терминала CLI.Я мог бы просто использовать параметры без имени команды.

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

...