Методы CommandLine.call
(и CommandLine.run
) вызывают только подкоманду last , так что то, что вы видите в исходном сообщении, является ожидаемым поведением.
Методы call
и run
на самом деле являются ярлыком.Следующие две строки эквивалентны:
CommandLine.run(callable, args); // internally uses RunLast, equivalent to:
new CommandLine(callable).parseWithHandler(new RunLast(), args);
Существует также обработчик RunAll
, который запускает все соответствующие команды.Следующий метод main
дает желаемое поведение:
public static void main(String[] args) {
args = new String[] { "--verbose", "push" };
GitApp app = new GitApp();
new CommandLine(app).parseWithHandler(new RunAll(), args);
System.out.println("#GitApp.main after. verbose: " + (app.verboseMode));
}
Вывод:
#GitApp.call
#PushCommand.call
#GitApp.main after. verbose: true
Вас также может заинтересовать аннотация @ParentCommand
.Это говорит Picocli о необходимости вставки экземпляра родительской команды в подкоманду.Ваша подкоманда может затем вызвать методы родительской команды, например, чтобы проверить, является ли verbose
истинным.Например:
import picocli.CommandLine;
import picocli.CommandLine.*;
@Command(name = "push",
description = "Update remote refs along with associated objects")
class PushCommand implements Runnable {
@ParentCommand // picocli injects the parent instance
private GitApp parentCommand;
public void run() {
System.out.printf("#PushCommand.call: parent.verbose=%s%n",
parentCommand.verboseMode); // use parent instance
}
}
@Command(description = "Version control",
mixinStandardHelpOptions = true, // auto-include --help and --version
subcommands = {PushCommand.class,
HelpCommand.class}) // built-in help subcommand
public class GitApp implements Runnable {
@Option(names = {"-v", "--verbose"},
description = "Verbose mode. Helpful for troubleshooting.")
boolean verboseMode;
public void run() {
System.out.println("#GitApp.call");
}
public static void main(String[] args) {
args = new String[] { "--verbose", "push" };
GitApp app = new GitApp();
new CommandLine(app).parseWithHandler(new RunAll(), args);
System.out.println("#GitApp.main after. verbose: " + (app.verboseMode));
}
}
Другие незначительные правки: сделали аннотации немного более компактными, импортировав внутренние классы.Вам также может понравиться атрибут mixinStandardHelpOptions
и встроенная подкоманда help
, которая помогает уменьшить стандартный код.