4. 命令

在本节中,我们将介绍实际的命令注册并保留命令选项 和执行以供稍后在文档中执行。您可以在 命令注册 中找到更多详细信息。spring-doc.cn

4.1. 注册

有两种不同的方法可以定义命令:通过注释模型和 通过编程模型。在 Comments 模型中,定义方法 ,并使用特定注释对类和方法进行注释。 在编程模型中,使用一种更底层的方法,定义命令 注册(作为 Bean 或通过动态注册到命令目录)。spring-doc.cn

4.1.1. 标注模型

当您使用标准 API 时,bean 上的方法将转换为可执行命令,前提是:spring-doc.cn

  • Bean 类带有 Comments。(这用于限制 bean 的集合 被考虑的。@ShellComponentspring-doc.cn

  • 该方法带有 Comments。@ShellMethodspring-doc.cn

这是一个构造型注释,它本身是用 .因此, 除了过滤机制之外,您还可以使用它来声明 bean(例如,通过使用)。@ShellComponent@Component@ComponentScanspring-doc.cn

您可以使用 Comments 的属性来定制创建的 Bean 的名称。valuespring-doc.cn

@ShellComponent
static class MyCommands {

	@ShellMethod
	public void mycommand() {
	}
}

注解唯一需要的属性是它的属性,它应该有 一个简短的一句话描述,说明命令的作用。这样,您的用户就可以 无需离开 shell 即可获得有关命令的一致帮助(请参阅帮助)。@ShellMethodvaluespring-doc.cn

命令的描述应该简短 — 不超过一两句话。为了更好 consistency,它应该以大写字母开头,以句点结尾。

默认情况下,您无需指定命令的键(即应使用的单词) 在 shell 中调用它)。方法的名称用作 command 键,将 camelCase 名称转换为 虚线、GNU 样式的名称(例如,变为 )。sayHello()say-hellospring-doc.cn

但是,您可以使用 annotation 的属性显式设置 command 键:keyspring-doc.cn

@ShellMethod(value = "Add numbers.", key = "sum")
public int add(int a, int b) {
	return a + b;
}
该属性接受多个值。 如果为单个方法设置多个键,则命令将使用这些不同的别名注册。key
Command 键几乎可以包含任何字符,包括空格。不过,在想出名字时, 请记住,一致性通常受到用户的赞赏。也就是说,您应该避免将虚线名称与 带空格的名称和其他不一致。

4.1.2. 编程模型

在编程模型中,可以定义为 a ,它将自动注册。CommandRegistration@Beanspring-doc.cn

@Bean
CommandRegistration commandRegistration() {
	return CommandRegistration.builder()
		.command("mycommand")
		.build();
}

如果所有命令都有共同点,则 创建一个 CommandRegistration.BuilderSupplier,它可以 被自动装配。此供应商的默认实现返回 一个新的构建器,因此您无需担心其内部状态。spring-doc.cn

自动以编程方式注册的命令 添加 Help Options 中提到的 Help 选项

如果定义了此供应商类型的 bean,则 auto-configuration 将退后,为您提供重新定义默认功能的选项。spring-doc.cn

@Bean
CommandRegistration commandRegistration(CommandRegistration.BuilderSupplier builder) {
	return builder.get()
		.command("mycommand")
		.build();
}

CommandRegistrationCustomizer如果你想集中 修改上述供应商提供的 Builder 实例。spring-doc.cn

@Bean
CommandRegistrationCustomizer commandRegistrationCustomizerExample() {
	return builder -> {
		// customize instance of CommandRegistration.Builder
	};
}

4.2. 组织命令

当你的 shell 开始提供大量功能时,你最终可能会遇到 使用大量命令,这可能会让您的用户感到困惑。通过键入 , 他们会看到一个令人生畏的命令列表,按字母顺序排列, 这可能并不总是显示可用命令的最佳方式。helpspring-doc.cn

为了减少这种可能的混淆, Spring Shell 提供了将命令分组在一起的能力。 具有合理的默认值。然后,相关命令将位于同一组中(例如,) 并一起显示在帮助屏幕和其他地方。User Management Commandsspring-doc.cn

默认情况下,命令根据它们在其中实现的类进行分组。 将 camelCase 类名转换为单独的单词(so 变为 )。 这是一个明智的默认值,因为相关命令通常已经在类中了。 ,因为他们需要使用相同的协作对象。URLRelatedCommandsURL Related Commandsspring-doc.cn

但是,如果此行为不适合您,则可以将组替换为 命令,按优先级顺序排列:spring-doc.cn

  1. 在注释中指定 a。group()@ShellMethodspring-doc.cn

  2. 将 a 放在定义命令的类上。这适用 该类中定义的所有命令的组(除非被覆盖,如前所述)。@ShellCommandGroupspring-doc.cn

  3. 在包上放置 (通过 ) 其中定义了命令。这适用于 package 中(除非在方法或类级别被覆盖,如前所述)。@ShellCommandGrouppackage-info.javaspring-doc.cn

下面的清单显示了一个示例:spring-doc.cn

public class UserCommands {
    @ShellMethod(value = "This command ends up in the 'User Commands' group")
    public void foo() {}

    @ShellMethod(value = "This command ends up in the 'Other Commands' group",
    	group = "Other Commands")
    public void bar() {}
}

...

@ShellCommandGroup("Other Commands")
public class SomeCommands {
	@ShellMethod(value = "This one is in 'Other Commands'")
	public void wizz() {}

	@ShellMethod(value = "And this one is 'Yet Another Group'",
		group = "Yet Another Group")
	public void last() {}
}

4.3. 动态命令可用性

由于应用程序的内部状态,注册的命令并不总是有意义。 例如,可能有一个命令,但只有在用户在远程 服务器。现在,如果用户尝试使用该命令,shell 应该解释 命令存在,但当时不可用。 Spring Shell 允许你这样做,甚至允许你提供 命令不可用。downloadconnectdownloadspring-doc.cn

命令有三种可能的方式来指示可用性。 它们都使用返回 . 请考虑以下示例:Availabilityspring-doc.cn

@ShellComponent
public class MyCommands {

    private boolean connected;

    @ShellMethod("Connect to the server.")
    public void connect(String user, String password) {
        [...]
        connected = true;
    }

    @ShellMethod("Download the nuclear codes.")
    public void download() {
        [...]
    }

    public Availability downloadAvailability() {
        return connected
            ? Availability.available()
            : Availability.unavailable("you are not connected");
    }
}

该方法用于连接到服务器(省略详细信息),从而更改状态 完成后通过布尔值执行命令。 由于存在,该命令在用户连接之前标记为不可用 的方法名称与名称中带有后缀的命令方法完全相同。 该方法返回 的实例 , 使用两个工厂方法之一构造。 如果该命令不可用,则必须提供解释。 现在,如果用户尝试在未连接的情况下调用命令,则情况如下:connectconnecteddownloaddownloadAvailabilityAvailabilityspring-doc.cn

shell:>download
Command 'download' exists but is not currently available because you are not connected.
Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.

集成帮助中还使用了有关当前不可用命令的信息。请参阅帮助spring-doc.cn

如果将命令不可用时提供的原因附加到 “Because” 之后,则应该读起来很不错。spring-doc.cn

您不应以大写字母开头或添加最后一个句点spring-doc.cn

如果在命令方法名称后命名 availability 方法不适合您,您可以 可以使用注释提供显式名称:@ShellMethodAvailabilityspring-doc.cn

    @ShellMethod("Download the nuclear codes.")
    @ShellMethodAvailability("availabilityCheck") (1)
    public void download() {
        [...]
    }

    public Availability availabilityCheck() { (1)
        return connected
            ? Availability.available()
            : Availability.unavailable("you are not connected");
    }
1 名称必须匹配

最后,通常情况下,同一类中的多个命令共享相同的内部状态,因此, 应全部作为一个组可用或不可用。Spring Shell 允许你翻转事情,将 Comments 放在 availability 方法上,指定它控制的命令的名称,而不必坚持所有命令方法:@ShellMethodAvailability@ShellMethodAvailabiltyspring-doc.cn

    @ShellMethod("Download the nuclear codes.")
    public void download() {
        [...]
    }

    @ShellMethod("Disconnect from the server.")
    public void disconnect() {
        [...]
    }

    @ShellMethodAvailability({"download", "disconnect"})
    public Availability availabilityCheck() {
        return connected
            ? Availability.available()
            : Availability.unavailable("you are not connected");
    }

该属性的默认值为 .这个特别的 通配符匹配所有命令名称。这样就可以轻松打开或关闭单个类的所有命令 使用单一可用性方法:@ShellMethodAvailability.value()*spring-doc.cn

@ShellComponent
public class Toggles {
  @ShellMethodAvailability
  public Availability availabilityOnWeekdays() {
    return Calendar.getInstance().get(DAY_OF_WEEK) == SUNDAY
      ? Availability.available()
      : Availability.unavailable("today is not Sunday");
  }

  @ShellMethod
  public void foo() {}

  @ShellMethod
  public void bar() {}
}
Spring Shell 对如何编写命令和如何组织类没有施加很多约束。 但是,将相关命令放在同一个类中通常是一种很好的做法,并且可用性指示符 可以从中受益。

4.4. 异常处理

异常发生在用户代码中,无论它是有意还是无意。本节介绍 如何处理异常并提供说明和最佳实践 与它合作。spring-shellspring-doc.cn

许多命令行应用程序(如果适用)会返回运行环境的退出代码 可用于区分命令是否已成功执行。在 this 中,这主要与命令在非交互模式下运行时有关,这意味着一个命令 始终使用 .请注意,退出代码始终与非交互式 shell 相关。spring-shellspring-shellspring-doc.cn

4.4.1. 异常解决

未处理的异常将冒泡到 shell 中,然后最终 由 的某个实例处理。实施链 可用于解决异常,并为您提供返回消息的灵活性 与包装在 . 可能包含消息和/或退出代码ResultHandlerServiceResultHandlerExceptionResolverCommandHandlingResultCommandHandlingResultspring-doc.cn

static class CustomExceptionResolver implements CommandExceptionResolver {

	@Override
	public CommandHandlingResult resolve(Exception e) {
		if (e instanceof CustomException) {
			return CommandHandlingResult.of("Hi, handled exception\n", 42);
		}
		return null;
	}
}

CommandExceptionResolver实现可以全局定义为 bean。spring-doc.cn

@Bean
CustomExceptionResolver customExceptionResolver() {
	return new CustomExceptionResolver();
}

或者 defined per 如果它仅适用于特定命令本身。CommandRegistrationspring-doc.cn

CommandRegistration.builder()
	.withErrorHandling()
		.resolver(new CustomExceptionResolver())
		.and()
	.build();
使用命令定义的解析程序在全局解析程序之前处理。

使用你自己的异常类型,它也可以是 boot 的 if 您希望在此处定义退出代码。ExitCodeGeneratorspring-doc.cn

static class CustomException extends RuntimeException implements ExitCodeGenerator {

	@Override
	public int getExitCode() {
		return 0;
	}
}

一些内置的 bean 被注册为处理常见的 命令解析引发的异常。这些 Cookie 使用 中定义的 order presedence 进行注册。 由于这些 bean 是按给定的顺序使用的,因此可以像在任何其他 Spring 应用程序中一样使用 Comments 或 interface from。这 如果您需要控制自己的 bean 才能使用 在 defaults 之前或之后。CommandExceptionResolverCommandExceptionResolver.DEFAULT_PRECEDENCE@OrderOrderedspring-doc.cn

4.4.2. 退出代码映射

退出代码的默认行为如下:spring-doc.cn

每个 Exception 都可以定义自己的 Exception退出代码之间的映射。 本质上,我们受制于有关退出代码的功能,并且简单地 融入其中。CommandRegistrationSpring Bootspring-doc.cn

假设下面有一个异常 show ,它将从命令中抛出:spring-doc.cn

static class MyException extends RuntimeException {

	private final int code;

	MyException(String msg, int code) {
		super(msg);
		this.code = code;
	}

	public int getCode() {
		return code;
	}
}

可以在 和 退出代码之间定义一个映射函数。您还可以 只需配置一个退出代码,这只是配置中的语法糖。Throwablespring-doc.cn

CommandRegistration.builder()
	.withExitCode()
		.map(MyException.class, 3)
		.map(t -> {
			if (t instanceof MyException) {
				return ((MyException) t).getCode();
			}
			return 0;
		})
		.and()
	.build();
无法使用基于注释的配置自定义退出代码

4.4.3. @ExceptionResolver

@ShellComponent类可以具有处理 Component 异常的方法 方法。这些用于带 Comments 的方法。@ExceptionResolverspring-doc.cn

该异常可能与正在传播的顶级异常匹配(例如,直接的 IOException 被抛出)或针对包装器异常中的嵌套原因(例如,包装的 IOException 在 IllegalStateException 中)。这可以在任意原因级别匹配。spring-doc.cn

对于匹配的异常类型,最好将目标异常声明为方法参数,如 前面的示例显示了。当多个异常方法匹配时,根异常匹配为 通常优先于 Cause 异常匹配。更具体地说,ExceptionDepthComparator 用于根据异常从引发的异常类型中对异常的深度对异常进行排序。spring-doc.cn

或者,注解声明可以缩小要匹配的异常类型,因为 以下示例显示:spring-doc.cn

@ExceptionResolver({ RuntimeException.class })
CommandHandlingResult errorHandler(Exception e) {
	// Exception would be type of RuntimeException,
	// optionally do something with it
	return CommandHandlingResult.of("Hi, handled exception\n", 42);
}
@ExceptionResolver
CommandHandlingResult errorHandler(RuntimeException e) {
	return CommandHandlingResult.of("Hi, handled custom exception\n", 42);
}

@ExceptionResolver也可以返回,该 CAN 用作 console 的输出。您可以 使用 annotation 定义返回代码。String@ExitCodespring-doc.cn

@ExceptionResolver
@ExitCode(code = 5)
String errorHandler(Exception e) {
	return "Hi, handled exception";
}

@ExceptionResolverwith return 类型会自动作为 Handled 异常处理。 然后,如果需要编写某些内容,您还可以定义并使用 进入控制台。void@ExitCodeTerminalspring-doc.cn

@ExceptionResolver
@ExitCode(code = 5)
void errorHandler(Exception e, Terminal terminal) {
	PrintWriter writer = terminal.writer();
	String msg =  "Hi, handled exception " + e.toString();
	writer.println(msg);
	writer.flush();
}
方法参数

@ExceptionResolver方法支持以下参数:spring-doc.cn

Method 参数 描述

异常类型spring-doc.cn

用于访问引发的异常。这是任何类型的 或 。ExceptionThrowablespring-doc.cn

终端spring-doc.cn

用于访问底层终端,即获取其终端写入器。JLinespring-doc.cn

返回值

@ExceptionResolver方法支持以下返回值:spring-doc.cn

返回值 描述

字符串spring-doc.cn

用于返回到 shell 的纯文本。在本例中,使用退出代码 1。spring-doc.cn

CommandHandlingResultspring-doc.cn

普通有消息和退出代码。CommandHandlingResultspring-doc.cn

无效spring-doc.cn

具有 void 返回类型的方法被视为已完全处理异常。通常 您将定义为方法参数,并使用 Terminal Writer 从中写入响应。由于异常已完全处理,因此在这种情况下使用 Exit code 0。Terminalspring-doc.cn

4.5. 隐藏命令

可以隐藏命令,这在尚未准备好的情况下很方便 Prime Time 用于调试目的,或者您有任何其他不想的原因 宣传它的 presense。spring-doc.cn

如果您知道 Hidden 命令及其选项,则可以执行它。它被有效地删除 从:spring-doc.cn

以下是如何将 command 定义为 hidden 的示例。它显示了可用的构建器方法 来定义隐藏状态。spring-doc.cn

CommandRegistration commandRegistration() {
	return CommandRegistration.builder()
		.command("mycommand")
		// define as hidden
		.hidden()
		// can be defined via a flag (false)
		.hidden(false)
		// can be defined via a flag (true)
		.hidden(true)
		.build();
}
基于注释的配置不支持定义隐藏命令

4.6. 帮助选项

Spring Shell 有一个内置命令,但并非所有人都喜欢获得命令帮助 从它开始,因为您总是需要使用 Arguments for Target Command 调用它。它 在许多 CLI 框架中,每个命令都有选项 --help-h 来打印命令 help。helpspring-doc.cn

默认功能是每个命令都会被修改为具有选项 --help-h,如果它们出现在给定的命令中,则会自动 将命令执行短路到现有命令中,无论 键入的其他命令行选项。helpspring-doc.cn

以下示例显示了其默认设置。spring-doc.cn

@Bean
CommandRegistration commandRegistration() {
	return CommandRegistration.builder()
		.command("mycommand")
		.withHelpOptions()
			.enabled(true)
			.longNames("help")
			.shortNames('h')
			.command("help")
			.and()
		.build();
}

可以通过配置选项更改默认行为。spring-doc.cn

spring:
  shell:
    help:
      enabled: true
      long-names: help
      short-names: h
      command: help
以编程方式或通过注释定义的命令将自动添加 help 选项。使用注释模型,您只能全局关闭,以编程方式 model 提供了修改每个命令的设置的选项。

4.7. 交互模式

命令注册可以定义用于隐藏命令的内容 取决于正在执行的模式 shell。更多相关信息,请参见 交互模式.InteractionModespring-doc.cn

您可以使用 .CommandRegisrationspring-doc.cn

CommandRegistration commandRegistration() {
	return CommandRegistration.builder()
		.command("mycommand")
		// can be defined for all modes
		.interactionMode(InteractionMode.ALL)
		// can be defined only for interactive
		.interactionMode(InteractionMode.INTERACTIVE)
		// can be defined only for non-interactive
		.interactionMode(InteractionMode.NONINTERACTIVE)
		.build();
}

或者使用 .@ShellMethodspring-doc.cn

@ShellMethod(key = "mycommand", interactionMode = InteractionMode.INTERACTIVE)
public void mycommand() {
}

4.8. 内置命令

4.8.1. 帮助

运行 shell 应用程序通常意味着用户处于图形受限的 环境。此外,虽然在手机时代我们几乎总是保持连接, 访问 Web 浏览器或任何其他富 UI 应用程序(如 PDF 查看器)可能并不总是 是可能的。这就是为什么 shell 命令必须正确地自我记录很重要的原因,这就是命令的用武之地。helpspring-doc.cn

键入 + 列出 shell 已知的所有命令(包括不可用的命令) 以及他们工作的简短描述,类似于以下内容:helpENTERspring-doc.cn

my-shell:>help
AVAILABLE COMMANDS

Built-In Commands
       exit: Exit the shell.
       help: Display help about available commands
       stacktrace: Display the full stacktrace of the last error.
       clear: Clear the shell screen.
       quit: Exit the shell.
       history: Display or save the history of previously run commands
       completion bash: Generate bash completion script
       version: Show version info
       script: Read and execute commands from a file.

键入 API 可显示有关命令的更多详细信息,包括可用参数、其 类型、是否为必填项以及其他详细信息。help <command>spring-doc.cn

下面的清单显示了应用于自身的命令:helpspring-doc.cn

my-shell:>help help
NAME
       help - Display help about available commands

SYNOPSIS
       help --command String

OPTIONS
       --command or -C String
       The command to obtain help for.
       [Optional]

帮助是模板化的,如果需要,可以进行自定义。设置位于可用于禁用命令、获取或希望通过展平来隐藏组的位置 结构,用于定义命令帮助输出的模板,用于定义 命令列表的输出。spring.shell.command.helpenabledgrouping-modegroupflatcommand-templatecommands-templatespring-doc.cn

如果已设置,则 help 将显示:spring.shell.command.help.grouping-mode=flatspring-doc.cn

my-shell:>help help
AVAILABLE COMMANDS

exit: Exit the shell.
help: Display help about available commands
stacktrace: Display the full stacktrace of the last error.
clear: Clear the shell screen.
quit: Exit the shell.
history: Display or save the history of previously run commands
completion bash: Generate bash completion script
version: Show version info
script: Read and execute commands from a file.

输出 和 都使用默认实现进行模板化 可以更改。helphelp <commmand>spring-doc.cn

Option 默认为 model 并作为模型传递。spring.shell.command.help.commands-templateclasspath:template/help-commands-default.stgGroupsInfoModelspring-doc.cn

Option 默认为 model 并作为模型传递。spring.shell.command.help.command-templateclasspath:template/help-command-default.stgCommandInfoModelspring-doc.cn

表 1.GroupsInfoModel 变量
钥匙 描述

showGroupsspring-doc.cn

true如果启用了 Showing Groups。否则为 false。spring-doc.cn

groupsspring-doc.cn

commands 变量(请参阅 GroupCommandInfoModel 变量)。spring-doc.cn

commandsspring-doc.cn

commands 变量(请参阅 CommandInfoModel 变量)。spring-doc.cn

hasUnavailableCommandsspring-doc.cn

true如果有不可用的命令。否则为 false。spring-doc.cn

表 2.GroupCommandInfoModel 变量
钥匙 描述

groupspring-doc.cn

组的名称(如果已设置)。否则为空。spring-doc.cn

commandsspring-doc.cn

命令 (如果已设置)。否则为空。Type 是多值,请参阅 CommandInfoModel 变量spring-doc.cn

表 3.CommandInfoModel 变量
钥匙 描述

namespring-doc.cn

命令的名称(如果已设置)。否则为 null。类型为 string 并包含 full 命令。spring-doc.cn

namesspring-doc.cn

命令的名称(如果已设置)。否则为 null。类型是多值,基本上是拆分的。namespring-doc.cn

aliasesspring-doc.cn

可能的别名(如果已设置)。类型是带字符串的多值。spring-doc.cn

descriptionspring-doc.cn

命令的描述(如果已设置)。否则为 null。spring-doc.cn

parametersspring-doc.cn

parameters 变量(如果已设置)。否则为空。Type 是多值,请参阅 CommandParameterInfoModel 变量spring-doc.cn

availabilityspring-doc.cn

可用性变量(请参阅 CommandAvailabilityInfoModel 变量)。spring-doc.cn

表 4.CommandParameterInfoModel 变量
钥匙 描述

typespring-doc.cn

参数的类型(如果已设置)。否则为 null。spring-doc.cn

argumentsspring-doc.cn

参数(如果已设置)。否则为 null。类型是带字符串的多值。spring-doc.cn

requiredspring-doc.cn

true如果需要。否则为 false。spring-doc.cn

descriptionspring-doc.cn

参数的描述 (如果已设置)。否则为 null。spring-doc.cn

defaultValuespring-doc.cn

参数的默认值 (如果已设置)。否则为 null。spring-doc.cn

hasDefaultValuespring-doc.cn

true如果存在 defaultValue。否则为 false。spring-doc.cn

表 5.CommandAvailabilityInfoModel 变量
钥匙 描述

availablespring-doc.cn

true如果可用。否则为 false。spring-doc.cn

reasonspring-doc.cn

如果设置了 not available (如果已设置),则为原因。否则为 null。spring-doc.cn

4.8.2. 清除

该命令将执行您所期望的操作并清除屏幕,重置提示符 。clearspring-doc.cn

4.8.3. 退出

该命令(也称为别名为 )请求 shell 正常退出 关闭 Spring 应用程序上下文。如果未覆盖,则 JLine bean 会写入所有 命令复制到磁盘,以便它们在下次启动时再次可用。quitexitHistoryspring-doc.cn

4.8.4. 堆栈跟踪

当命令代码中发生异常时,shell 会捕获该异常,并显示一条简单的单行消息 以免用户收到太多信息。 但是,在某些情况下,了解到底发生了什么很重要(尤其是在异常具有嵌套原因时)。spring-doc.cn

为此, Spring Shell 会记住上次发生的异常,用户稍后可以使用该命令在控制台上打印所有详细信息。stacktracespring-doc.cn

4.8.5. 脚本

该命令接受本地文件作为参数,并重放在其中找到的命令,一次重放一个命令。scriptspring-doc.cn

从文件中读取的行为与在交互式 shell 中完全一样,因此会考虑以 作为注释并被忽略,而以 trigger line continuation 结尾的行。//\spring-doc.cn

4.8.6. 历史

该命令显示已执行的命令的历史记录。historyspring-doc.cn

您可以使用一些配置选项来配置行为 的历史。历史记录保存在日志文件中,该文件默认处于启用状态,并且可以 通过设置 来关闭。日志文件的名称 解析自 ,默认为 , 您可以通过设置 来更改。spring.shell.history.enabledspring.application.namespring-shell.logspring.shell.history.namespring-doc.cn

默认情况下,将生成一个日志文件到当前工作目录,您可以指定该目录 通过设置 .此属性可以包含 placeholder () ),解析为通用共享配置目录。spring.shell.config.location{userconfig}spring-doc.cn

运行 Spring Shell 应用程序,查看示例应用程序在使用这些选项时的工作原理。

4.8.7. 完成

命令集允许您创建可以使用的脚本文件 使用 AM OS shell 实现来提供补全。这在以下情况下非常有用 使用非交互模式。completionspring-doc.cn

目前,唯一的实现是 bash,它与 sub-command 一起使用。bashspring-doc.cn

4.8.8. 版本

该命令通过集成到 Boot,如果它们存在于 shell 应用程序中。 默认情况下,只显示版本信息,您可以通过配置启用其他信息 选项。versionBuildPropertiesGitPropertiesspring-doc.cn

相关设置位于 下,您可以在其中使用 禁用命令,并可选择使用 定义您自己的模板。您可以使用 、 、 、 、 和 命令来控制 字段。spring.shell.command.versionenabledtemplateshow-build-artifactshow-build-groupshow-build-nameshow-build-timeshow-build-versionshow-git-branchshow-git-commit-idshow-git-short-commit-idshow-git-commit-timespring-doc.cn

模板默认为 ,您可以定义 您自己的,如下例所示:classpath:template/version-default.stspring-doc.cn

<buildVersion>

此设置将输出如下内容:spring-doc.cn

X.X.X

您可以将以下属性添加到默认模板渲染中:、、、、 和 。buildVersionbuildGroupbuildGroupbuildNamebuildTimegitShortCommitIdgitCommitIdgitBranchgitCommitTimespring-doc.cn

4.9. 写入

当需要将某些内容写入您的控制台时,您始终可以 使用 JDK,然后直接进入 JDK 自己的流。 其他推荐的方法是使用 JLine 并从那里获取 writer 实例。System.outTerminalspring-doc.cn

如果使用目标终端节点,即不需要的 consumer 要返回任何内容,可以从那里访问给定的包含引用和 writer。CommandContextTerminalspring-doc.cn

CommandRegistration.builder()
	.command("example")
	.withTarget()
		.consumer(ctx -> {
			ctx.getTerminal().writer().println("hi");
			ctx.getTerminal().writer().flush();
		})
		.and()
	.build();

可以通过 autowire 来访问它的 writer。Terminalspring-doc.cn

@Autowired
Terminal terminal;

@ShellMethod
public void example() {
	terminal.writer().println("hi");
	terminal.writer().flush();
}