在创建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
}
}
}
答案 0 :(得分:0)
完成此操作的一种方法是将@Inject
ApplicationContext
放入您的@Command
注释的类中。这使您的命令可以使用相同的应用程序上下文,而无需启动单独的上下文。
然后,在您的run
方法中,您可以通过从应用程序上下文中获取EmbeddedServer
并在其上调用start
来启动REST服务器,也可以直接执行该功能而无需REST服务器。
有关更多详细信息,请参见以下答案:https://stackoverflow.com/a/56751733/1446916