我必须将大型 Spring boot 应用程序转换为灵活的 CLI 工具,其中 Spring boot 应用程序发送的请求(除其他外)由命令行中的用户输入确定。我决定使用 picocli 来实现命令行功能,但是如果用户传递给定的选项标志,我什至无法弄清楚如何做一些简单的事情,比如将一些文本打印到标准输出,Spring boot 只是像往常一样运行。我应该怎么写这样 picocli 可以与 Spring boot 一起运行(并最终控制所有 Spring boot 的东西)
问问题
1115 次
1 回答
3
作为对此的跟进,我最终通过将“控制器方法”重构为 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);
}
CommandLine
它在新的 picocli对象上执行传递的 cli 参数(从 MainApp.java 传递给它) 。这将我们带到了最后一个类,TheCommand.java
它同时是实现接口的 picocli@Command
和 Springboot 。基本上只包含我需要提供的所有逻辑和(不断增长的)功能。@Controller
Runnable
此实现的唯一缺点是,当用户使用--help
标志运行它时,应用程序仍然运行 spring boot 的东西,使其在特定情况下有点反应迟钝。
于 2021-04-30T15:29:03.903 回答