Приложение Picocli Spring boot CLI

#spring-boot #command-line-interface #picocli

Вопрос:

Я пытаюсь создать приложение spring boot CLI с помощью picocli. Я выполнил шаги, упомянутые в руководстве, но когда я запускаю службу, запускается весь поток. Что я хочу, так это вызвать команду из терминала, после чего должен сработать только поток.Кто-нибудь может, пожалуйста, помочь мне решить эту проблему. Ниже приведен мой код.

Класс компонентов

 public class AppCLI implements CommandLineRunner {

    @Autowired
    AppCLI appCLI;

    public String hello(){
        return "hello";
    }

    @CommandLine.Command(name = "command")
    public void command() {
        System.out.println("Adding some files to the staging area");
    }

    @Override
    public void run(String... args) throws Exception {
        CommandLine commandLine = new CommandLine(appCLI);
        commandLine.parseWithHandler(new CommandLine.RunLast(), args);
        System.out.println("In the main method");
        hello();
        command();
    }
}

Command class

@Controller
@CommandLine.Command(name = "xyz",description = "Performs ", mixinStandardHelpOptions = true, version = "1.0")
public class AppCLI implements Runnable{
    @Override
    public void run() {
        System.out.println("Hello");
    }
}

Main Class

@SpringBootApplication
public class Application {

    private static Logger LOG = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }


}

Thanks in advance.
 

Ответ №1:

Если вы хотите добавить синтаксический анализ командной строки во внешнюю конфигурацию Spring Boot в @SpringBootApplication , сделайте что-нибудь вроде (см. Connect.java):

 import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import picocli.CommandLine;

@SpringBootApplication
@Command
@NoArgsConstructor @ToString @Log4j2
public class Connect implements ApplicationRunner {
    @Option(description = { "connection_file" }, names = { "-f" }, arity = "1")
    @Value("${connection-file:#{null}}")
    private String connection_file = null;

    @Override
    public void run(ApplicationArguments arguments) throws Exception {
        new CommandLine(this)
            .setCaseInsensitiveEnumValuesAllowed(true)
            .parseArgs(arguments.getNonOptionArgs().toArray(new String [] { }));
        /*
         * Command implementation; command completes when this method
         * completes.
         */
    }
}
 

Есть аналогичный пример в
Install.java
.