У меня нет проблем с созданием 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
}
}
}