让 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 提供的 @Component
和 CommandLineRunner
接口的简单实现,最重要的部分如下:
@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 启动内容,使其在特定情况下有点反应迟钝。
我必须将大型 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 提供的 @Component
和 CommandLineRunner
接口的简单实现,最重要的部分如下:
@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 启动内容,使其在特定情况下有点反应迟钝。