让 Picocli 与 Springboot 应用程序一起工作

Getting Picocli to work with Springboot application

我必须将大型 Spring 启动应用程序转换为灵活的 CLI 工具,其中 Spring 启动应用程序发送的请求(除其他外)由用户在命令中输入确定线。我决定使用 picocli 来实现命令行功能,但是如果用户传递了给定的选项标志,我什至不知道如何做一些简单的事情,比如将一些文本打印到标准输出,Spring boot 只是运行它通常会。我应该如何编写此代码,以便 picocli 可以与 Spring 引导一起运行(并最终控制所有 Spring 引导内容)

作为对此的后续行动,我最终通过将“控制器方法”重构为 3 个来使代码正常工作,如下所示:

|
|_ MainApp.java
|_ CmdRunner.java
|_ TheCommand.java

MainApp 是 @SpringBootApplication,它基本上只是做:

System.exit(SpringApplication.exit(new SpringApplication(MainApp.class).run(args)));

开始一切。

CmdRunner 是 SpringBoot 提供的 @ComponentCommandLineRunner 接口的简单实现,最重要的部分如下:

    @Autowired
    private TheCommand theCommand;

    @Override
    public void run(String... args) {
       new CommandLine(theCommand).execute(args);
    }

它在新的 picocli CommandLine 对象上执行传递的 cli 参数(从 MainApp.java 传递给它的)。这将我们带到了最终的 class、TheCommand.java,它同时是实现 Runnable 接口的 picocli @Command 和 Springboot @Controller。基本上只包含我需要交付的所有逻辑和(不断增长的)功能。

此实现的唯一缺点是,当用户使用 --help 标志运行它时,该应用程序仍会运行 spring 启动内容,使其在特定情况下有点反应迟钝。