멋진 해결책을 찾았습니다. JLineInputProvider
은 개인 클래스이므로 v1 동작을 모방 한 ApplicationRunner
을 만드는 대신 활성 스프링 프로필을 기반으로 선택적으로로드되는 템플릿을 만들었습니다. JCommander를 사용하여 CLI 매개 변수를 정의 했으므로 대화 형 셸과 일회용 실행에 대해 동일한 명령을 사용할 수 있습니다. args가없는 Spring Boot JAR을 실행하면 대화식 쉘이 트리거됩니다. 인수로 실행하면 일회성 실행이 트리거됩니다. 내가 명령 줄에 인수를 전달하는 경우
java -jar app.jar
> import -f /path/to/file.txt -t GENE -o
> quit()
가 아니면, 그들이 실행하고 다음 종료 :
public class JCommanderImportCommands {
public static enum DataType { SAMPLE, GENE, DATA }
@Parameter(names = { "-f", "--file" }, required = true, description = "Data file")
private File file;
@Parameter(names = { "-t", "--type" }, required = true, description = "Data type")
private DataType dataType;
@Parameter(names = { "-o", "--overwrite" }, description = "Flag to overwrite file if it exists")
private Boolean overwrite = false;
/* getters and setters */
}
@ShellComponent
public class ImportCommands {
@ShellMethod(key = "import", value = "Imports the a file of a specified type.")
public String jCommanderFileImport(@ShellOption(optOut = true) JCommanderImportCommands commands){
System.out.println(String.format("Importing file=%s dataType=%s overwrite=%s",
commands.getFile(), commands.getDataType(), commands.getOverwrite()));
return commands.getFile().getAbsolutePath();
}
}
public class JCommanderShellRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
JCommanderImportCommands importCommands = new JCommanderImportCommands();
JCommander.newBuilder()
.addCommand("import", importCommands)
.acceptUnknownOptions(true)
.build()
.parse(args.getSourceArgs());
System.out.println(String.format("Importing file=%s dataType=%s overwrite=%s",
importCommands.getFile(), importCommands.getDataType(), importCommands.getOverwrite()));
}
}
@Configuration
@Profile({"jc"})
public class ShellConfig {
@Bean
public JCommanderShellRunner shellRunner(){
return new JCommanderShellRunner();
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) throws IOException {
String[] profiles = getActiveProfiles(args);
SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
builder.bannerMode((Mode.LOG));
builder.web(false);
builder.profiles(profiles);
System.out.println(String.format("Command line arguments: %s Profiles: %s",
Arrays.asList(args), Arrays.asList(profiles)));
builder.run(args);
}
private static String[] getActiveProfiles(String[] args){
return args.length > 0 ? new String[]{"jc"} : new String[]{};
}
}
그래서 지금은 단순히 내 실행 JAR를 실행하여 대화 형 클라이언트를 실행할 수 있습니다
java -jar app.jar import -f /path/to/file.txt -t GENE -o
합니다. 내가 좋은 것을 생각해 내면 여기서 나의 해결책을 게시 할 것이다. 감사. – woemler