实现 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
}
}
}
实现此目的的一种方法是 @Inject
将 ApplicationContext
放入您的 @Command
注释 class 中。这允许您的命令使用相同的应用程序上下文,而不需要启动一个单独的应用程序上下文。
然后,在您的 run
方法中,您可以通过从应用程序上下文中获取 EmbeddedServer
并对其调用 start
来启动 REST 服务器,或者您可以执行功能直接没有 REST 服务器。
另请参阅此答案以获取更多详细信息:
我在创建 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
}
}
}
实现此目的的一种方法是 @Inject
将 ApplicationContext
放入您的 @Command
注释 class 中。这允许您的命令使用相同的应用程序上下文,而不需要启动一个单独的应用程序上下文。
然后,在您的 run
方法中,您可以通过从应用程序上下文中获取 EmbeddedServer
并对其调用 start
来启动 REST 服务器,或者您可以执行功能直接没有 REST 服务器。
另请参阅此答案以获取更多详细信息: