#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.