рдХрднреА-рдХрднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реАрдзреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рд╕реНрдкреНрд░рд┐рдВрдЧ рд╢реЗрд▓ рд╣реИред
рдЯреЗрд╕реНрдЯ рднреА рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ (рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ) рдФрд░, рдХрднреА-рдХрднреА, рд╡реЗ @SpringBootTest рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рд╢реЗрд▓ рдореЗрдВ рдкреНрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ ... рдЖрдкрдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗрд╡рд▓ рдХрдВрд╕реЛрд▓ рд╕реЗ рдПрдХ рдХрдорд╛рдВрдб рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рдлреНрд░реАрдЬ рд╣реЛрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВредрдЧреВрдЧрд▓
GitHub рдкрд░ рдПрдХ рдЫреЛрдЯреА рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдкрд╛рддреЗ рд╣реИрдВ ред
рд╢реЗрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦрдХ рдмрд┐рди рдХреЛ рдПрдкреНрд▓реАрдХреЗрд╢рдирд░реВрдирд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрдВрд╕реЛрд▓ рд╕реЗ рдПрдХ рдХрдорд╛рдВрдб рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ @ShellComponent рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЖрджреЗрд╢реЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдФрд░ рдЙрдирдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рдорд╛рдзрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
@Component
public class CliAppRunner implements ApplicationRunner {
public CliAppRunner() {
}
@Override
public void run(ApplicationArguments args) throws Exception {
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes =CliConfig.class)
public class ShellCommandIntegrationTest {
@Autowired
private Shell shell;
@Test
public void runTest(){
Object result=shell.evaluate(new Input(){
@Override
public String rawText() {
return "add 1 3";
}
});
DefaultResultHandler resulthandler=new DefaultResultHandler();
resulthandler.handleResult(result);
}
}
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЕрднреА рднреА рдЯреАрдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВредрдпрд╣ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!
рд╣рд▓реНрдХреЗ рдбрд┐рдмрдЧ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧрдкреЗрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд▓рд╛рд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдорд┐рд▓рддреЗ рд╣реИрдВ:
private void callRunners(ApplicationContext context, ApplicationArguments args) {
List<Object> runners = new ArrayList<>();
runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
AnnotationAwareOrderComparator.sort(runners);
for (Object runner : new LinkedHashSet<>(runners)) {
if (runner instanceof ApplicationRunner) {
callRunner((ApplicationRunner) runner, args);
}
if (runner instanceof CommandLineRunner) {
callRunner((CommandLineRunner) runner, args);
}
}
}
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдмрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо ApplicationRunner рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдмрд┐рди рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЙрди рд╕рднреА рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИредрдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рд╣реИ - рдмрд┐рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ! рд╕реНрдкреНрд░рд┐рдВрдЧ рд╢реИрд▓ рд╕реНрд░реЛрдд рдореЗрдВ рдЖрдиреЗ рдХрд╛ рд╕рдордпред
рд░рд┐рдбрд┐рдлрд╛рдЗрди рдмреАрди
рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ JLineShellAutoConfiguration рдХреНрд▓рд╛рд╕ рд░рдирд░реНрд╕ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рдо scriptApplicationRunner рдмреАрди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред
, ( spring.main.allow-bean-definition-overriding=true Spring 2.+):
@TestConfiguration
static class Runner {
@Bean
public ApplicationRunner scriptApplicationRunner(){
return new CliAppRunner();
}
}
, . JLineShellAutoConfiguration Runner scriptApplicationRunner. ( тАФ - тАФ , ?).
, , JLineShellAutoConfiguration:
@Bean
@ConditionalOnProperty(prefix = SPRING_SHELL_SCRIPT, value = ScriptShellApplicationRunner.ENABLED, havingValue = "true", matchIfMissing = true)
public ApplicationRunner scriptApplicationRunner(Parser parser, ConfigurableEnvironment environment) {
return new ScriptShellApplicationRunner(parser, shell, environment);
}
, тАФ property, . application.properties:
spring.shell.script.enabled=false
. . .
ScriptShellApplicationRunner , property. :
public static final String SPRING_SHELL_SCRIPT = "spring.shell.script";
public static final String ENABLED = "spring.shell.script";
public static final String SPRING_SHELL_SCRIPT_ENABLED = SPRING_SHELL_SCRIPT + "." + ENABLED;
рд╡рд╛рд╣, рдЕрдм рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд▓рдЧ рд░рд╣рд╛ рд╣реИ - рд╡рд╛рдкрд╕ application.properties рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд▓рд┐рдЦреЗрдВ:
spring.shell.script.spring.shell.script=false
рдЕрдкрдиреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░реЗрдВред рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВред рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдорд╛рдорд▓рд╛ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред