适当的方式来实现cli应用程序,该应用程序也与Micronaut一起使用服务配置文件

时间:2019-08-19 14:44:49

标签: java micronaut picocli

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

问题是,我想拥有一个通过REST Server提供一些业务逻辑的应用程序(那里没有问题),但是在其他情况下,我想通过CLI触发业务逻辑而不启动HTTP Server(例如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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

完成此操作的一种方法是将@Inject ApplicationContext放入您的@Command注释的类中。这使您的命令可以使用相同的应用程序上下文,而无需启动单独的上下文。

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

有关更多详细信息,请参见以下答案:https://stackoverflow.com/a/56751733/1446916