我在創建 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 } }}
1 回答

qq_笑_17
TA貢獻1818條經驗 獲得超7個贊
實現此目的的一種方法是@Inject
進入ApplicationContext
您的@Command
-annotated 類。這允許您的命令使用相同的應用程序上下文,而不是需要啟動一個單獨的應用程序上下文。
然后,在您的方法中,您可以通過從應用程序上下文run
獲取并調用它來啟動 REST 服務器,或者您可以在沒有 REST 服務器的情況下直接執行該功能。EmbeddedServer
start
添加回答
舉報
0/150
提交
取消