Утилиты командной строки
Я думаю, что путаница, связанная с упаковкой 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,Вы должны иметь в виду, что команда верхнего уровня не указана в командной строке .
Следовательно, все команды, которые вы хотите, чтобы пользователи могли вводить в оболочке должно быть подкомандами , как вы описали в своем ответе.
Команда верхнего уровня все еще может быть полезна для оказания помощи пользователям.Одна из идей состоит в том, чтобы напечатать дружественное справочное сообщение с последующей справкой по использованию команды верхнего уровня, когда пользователь вводит недопустимую команду (или просто нажимает ввод без параметров).