我必须将大型 Spring boot 应用程序转换为灵活的 CLI 工具,其中 Spring boot 应用程序发送的请求(除其他外)由用户在命令行的输入确定。我决定使用 picocli 来实现命令行功能,但是如果用户传递给定的选项标志,我什至不知道如何做一些简单的事情,比如将一些文本打印到 stdout,Spring boot 只是像往常一样运行。我应该如何编写这个以便 picocli 可以与 Spring boot 一起运行(并最终控制所有 Spring boot 的东西)
答案 0 :(得分:1)
作为对此的后续行动,我最终通过将“控制器方法”重构为 3 来使代码正常工作,如下所示:
|
|_ MainApp.java
|_ CmdRunner.java
|_ TheCommand.java
其中 MainApp 是 @SpringBootApplication
,它基本上就是这样做的:
System.exit(SpringApplication.exit(new SpringApplication(MainApp.class).run(args)));
开始一切。
CmdRunner 是 SpringBoot 提供的 @Component
接口的一个 CommandLineRunner
简单实现,最重要的一点如下:
@Autowired
private TheCommand theCommand;
@Override
public void run(String... args) {
new CommandLine(theCommand).execute(args);
}
它在新的 picocli CommandLine
对象上执行传递的 cli 参数(从 MainApp.java 传递给它)。这将我们带到了最后一个类 TheCommand.java
,它同时是实现 @Command
接口的 picocli @Controller
和 Springboot Runnable
。基本上只包含我需要交付的所有逻辑和(不断增长的)功能。
此实现的唯一缺点是,当用户使用 --help
标志运行它时,该应用仍会运行 spring boot 内容,使其在该特定情况下有点无响应。