3

我必须将大型 Spring boot 应用程序转换为灵活的 CLI 工具,其中 Spring boot 应用程序发送的请求(除其他外)由命令行中的用户输入确定。我决定使用 picocli 来实现命令行功能,但是如果用户传递给定的选项标志,我什至无法弄清楚如何做一些简单的事情,比如将一些文本打印到标准输出,Spring boot 只是像往常一样运行。我应该怎么写这样 picocli 可以与 Spring boot 一起运行(并最终控制所有 Spring boot 的东西)

4

1 回答 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 。基本上只包含我需要提供的所有逻辑和(不断增长的)功能。@ControllerRunnable

此实现的唯一缺点是,当用户使用--help标志运行它时,应用程序仍然运行 spring boot 的东西,使其在特定情况下有点反应迟钝。

于 2021-04-30T15:29:03.903 回答