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

时间:2021-04-23 11:37:18

标签: java spring spring-boot maven picocli

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

1 个答案:

答案 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 内容,使其在该特定情况下有点无响应。

相关问题