该版本仍在开发中,尚未被视为稳定。最新稳定版本请使用Spring Shell 3.4.1spring-doc.cadn.net.cn

指令注册

定义命令注册是引入命令结构及其选项的第一步以及参数。这与后续处理(如解析命令行输入和运行实际目标代码)是松散的。本质上,它是向用户展示的命令API定义。spring-doc.cadn.net.cn

命令

一个命令Spring Shell结构被定义为命令数组。这会产生一个类似于以下示例的结构:spring-doc.cadn.net.cn

command1 sub1
command2 sub1 subsub1
command2 sub2 subsub1
command2 sub2 subsub2
如果定义了子命令,我们目前不支持将命令映射到显式父命令。 例如命令1 子1命令1 sub1 subsub1不能同时注册。

交互模式

Spring Shell 设计用于两种模式:交互式(本质上是是REPL在一系列命令中,你有一个活跃的 shell 实例)以及非交互式(命令从命令行逐个执行)。spring-doc.cadn.net.cn

这些模式之间的区别主要在于对每种模式可执行的限制。在每种模式下。例如,如果 shell 不再激活,显示之前的 stacktrace 是不可行的命令的。通常,shell 是否仍然活跃决定了可用信息的范围。spring-doc.cadn.net.cn

另外,服用活性药物REPL会话可能会提供更多关于用户在活动会话中所做事情的信息。spring-doc.cadn.net.cn

选项

期权可以定义为多头和短头,前缀分别为 和 。以下示例展示了多头和短头期权:---spring-doc.cadn.net.cn

CommandRegistration.builder()
	.withOption()
		.longNames("myopt")
		.and()
	.build();
CommandRegistration.builder()
	.withOption()
		.shortNames('s')
		.and()
	.build();

目标

目标定义命令的执行目标。它可以是POJO中的一个方法, 一个消费者,或功能.spring-doc.cadn.net.cn

方法

使用方法在现有的POJO中,是定义目标的一种方式。考虑以下类:spring-doc.cadn.net.cn

public static class CommandPojo {

	String command(String arg) {
		return arg;
	}
}

根据前面列表中显示的现有类,你可以注册其方法:spring-doc.cadn.net.cn

CommandPojo pojo = new CommandPojo();
CommandRegistration.builder()
	.command("command")
	.withTarget()
		.method(pojo, "command")
		.and()
	.withOption()
		.longNames("arg")
		.and()
	.build();

功能

使用功能作为目标,可以非常灵活地处理命令执行中发生的事情因为你可以通过使用 一个命令上下文赋予功能. 来自 的返回类型功能是 然后打印到壳壳中的内容。请考虑以下示例:spring-doc.cadn.net.cn

CommandRegistration.builder()
	.command("command")
	.withTarget()
		.function(ctx -> {
			String arg = ctx.getOptionValue("arg");
			return String.format("hi, arg value is '%s'", arg);
		})
		.and()
	.withOption()
		.longNames("arg")
		.and()
	.build();

消费者

使用消费者基本上等同于功能,区别在于没有返回类型。如果你需要将某样东西打印到一个壳中,你可以获得一个引用终端从上下文中打印出某样东西穿透它。请考虑以下示例:spring-doc.cadn.net.cn

CommandRegistration.builder()
	.command("command")
	.withTarget()
		.consumer(ctx -> {
			String arg = ctx.getOptionValue("arg");
			ctx.getTerminal().writer()
				.println(String.format("hi, arg value is '%s'", arg));
		})
	.and()
	.withOption()
		.longNames("arg")
		.and()
	.build();