java - 解析多个 picocli(子)命令和 shell
问题描述
如何构建一个Spring Boot 2.3多命令 CLI 应用程序,该应用程序可以使用单个命令、@script 并在picocli中以交互方式运行?它的行为应该是这样的:
manager -u <user> -p <pass> [list|create|delete] # run and exit
manager -u <user> -p <pass> @script # run and exit
manager -u <user> -p <pass> # run shell
用户名-u
和密码-p
是必需的,三个命令(list
、create
和delete
)各有不同的选项和参数。
解决方案
Spring Boot 应用程序很简单:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
System.exit(SpringApplication.exit(
SpringApplication.run(Application.class, args))
);
}
}
CommandLineRunner
并且带有返回值的 Spring Boot也很简单,调用picocli来CommandLine
解析和执行命令:
@Component
public class ApplicationRunner implements CommandLineRunner, ExitCodeGenerator {
private int exitCode;
@Override
public void run(String... args) throws Exception {
exitCode = new CommandLine(new ConnectCommand()).execute(args);
}
@Override
public int getExitCode() {
return exitCode;
}
}
启用picocli的 @-file 支持并使用“标准”选项( ,等)启用帮助和版本信息的ConnectCommand
has :showAtFileInUsageHelp = true
mixinStandardHelpOptions
-h
--help
@Command(
name = "manager",
description = "The manager description",
showAtFileInUsageHelp = true,
mixinStandardHelpOptions = true,
subcommands = {
ListCommand.class,
CreateCommand.class,
DeleteCommand.class
})
@Component
public class ConnectCommand implements Runnable, ExitCodeGenerator {
@Option(
names = {"-u", "--username"},
description = "The username")
private String username;
@Option(
names = {"-p", "--password"},
description = "The password")
private String password;
private int exitCode;
@Override
public void run() {
// WIP: kick-off shell
}
@Override
public int getExitCode() {
return exitCode;
}
}
并且(子)命令都采用这种形式(撒在picocli中@Option
并@Parameters
根据需要):
@Command(
name = "list",
mixinStandardHelpOptions = true,
header = "list stuff")
@Component
class ListCommand implements Runnable{
@Override
public void run() {
System.out.println("listing...");
}
}
有了这个,帮助现在看起来像:
Usage: manager [-hV] [-u=username] [-p=password] [@<filename>...] [COMMAND]
The manager description
[@<filename>...] One or more argument files containing options.
-u, --username=name The username
-p, --password=pass The password
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
Commands:
list list stuff
create create stuff
delete delete stuff
运行单个命令即可:
java -jar manager.jar -u=myname -p=mypass list
listing...
并且运行包含“列表”的@文件也可以:
java -jar manager.jar -u=myname -p=mypass @listing
listing...
这是一个示例存储库。现在我们需要折叠外壳......
推荐阅读
- arrays - 如何在不使用 segue 的情况下将大量数据从 viewController 传递到另一个?
- javascript - 从扩展泛型中提取类型
- python - load_model 在已经训练好的模型上评估测试数据的准确性非常低
- python - 在 Python 中解析响应
- javascript - 需要帮助 理解 javascript 图库代码
- database - thymeleaf hw 用模型属性填充 th:field 值
- android - 如何使用 ViewGroup 作为过渡动画的共享元素?
- amazon-web-services - 将内容从旧 EBS 卷复制到 AWS 中的新 Nitro 系统 EBS 的最佳方式(最简单/最快)?
- validation - 使用提示验证结构字段值的唯一性
- javascript - 在对象数组中,如何在 React 中按属性返回所有对象?