实现 cli 应用程序的适当方法,该应用程序也使用 Micronaut 的服务配置文件

Appropriate way to implement a cli Application which also uses the service profile with Micronaut

我在创建 REST 服务器或 Picocli CLI 应用程序时没有问题。 但是,如果我想在一个应用程序中同时拥有这两者怎么办?

问题是,我想要一个通过 REST 服务器提供一些业务逻辑的应用程序(这没​​问题),但在其他一些情况下,我想通过 CLI 触发业务逻辑而不启动 HTTP 服务器(例如. 对于 CI/CD).

我不确定如果我通过 PicocliRunner.run(Application.class, args) 并且如果给定特定参数 运行 服务器 Micronaut.run(Application.class);,因为它们创建不同的上下文。

有谁知道实现此目的的正确方法吗?

我是这样解决的:

import io.micronaut.configuration.picocli.PicocliRunner;
import io.micronaut.runtime.Micronaut;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;

@Command(
        name = "RestAndCliExample",
        description = "...",
        mixinStandardHelpOptions = true
)
public class Application implements Runnable {
    private enum Mode {serve, run}

    @Parameters(index = "0", description = "Execution mode: ${COMPLETION-CANDIDATES}")
    private Mode mode;

    public static void main(String[] args) throws Exception {
        args = new String[]{"run"};
        PicocliRunner.run(Application.class, args);
    }

    public void run() {
        if (Mode.serve.equals(mode)) {
            // Start REST API
            Micronaut.run(Application.class);
        } else {
            // TODO run code directly
        }
    }
}

实现此目的的一种方法是 @InjectApplicationContext 放入您的 @Command 注释 class 中。这允许您的命令使用相同的应用程序上下文,而不需要启动一个单独的应用程序上下文。

然后,在您的 run 方法中,您可以通过从应用程序上下文中获取 EmbeddedServer 并对其调用 start 来启动 REST 服务器,或者您可以执行功能直接没有 REST 服务器。

另请参阅此答案以获取更多详细信息: