目前,我正在尝试使用CommandLineRunner
和ConfigurableApplicationContext
默认情况下将Spring启动应用程序作为Web应用程序运行,并根据需要作为独立的命令行应用程序运行(通过命令行)某种参数)。我正在努力弄清楚如何在提供程序参数时将其作为控制台应用程序运行。请提出任何建议。
答案 0 :(得分:4)
CommandLineRunner
接口提供了一种在应用程序启动后获取命令行参数的有用方法,但它无助于更改应用程序的性质。正如您可能已经发现的那样,应用程序可能不会退出,因为它认为它需要处理传入的Web请求。
您在主要方法中采用的方法对我来说是明智的。你需要告诉Spring Boot它不是一个Web应用程序,因此一旦它被启动就不应该一直在监听传入的请求。
我会做这样的事情:
public static void main(String[] args) {
SpringApplication application = new SpringApplication(AutoDbServiceApplication.class);
application.setWeb(ObjectUtils.isEmpty(args);
application.run(args);
}
这应该以正确的模式启动应用程序。然后,您可以使用与当前相同的方式使用CommandLineRunner
bean。您可能还想查看具有更好API的ApplicationRunner
:
@Component
public class AutoDbApplicationRunner implements ApplicationRunner {
public void run(ApplicationArguments args) {
if (ObjectUtils.isEmpty(args.getSourceArgs)) {
return; // Regular web application
}
// Do something with the args.
if (args.containsOption(“foo”)) {
// …
}
}
}
如果你真的不想创建AutoDbApplicationRunner
bean,你可以考虑在main方法中设置一个你以后可以使用的配置文件(参见SpringApplication.setAdditionalProfiles
)。
答案 1 :(得分:0)
我有同样的要求。这是我能够实现的方式:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplicationBuilder app = new SpringApplicationBuilder(Application.class);
if (args.length == 0) { // This can be any condition you want
app.web(WebApplicationType.SERVLET);
} else {
app.web(WebApplicationType.NONE);
}
app.run(args);
}
}
这是控制台应用程序运行程序。
@Component
@ConditionalOnNotWebApplication
public class ConsoleApplication implements CommandLineRunner {
@Override
public void run(String... args) {
System.out.println("************************** CONSOLE APP *********************************");
}
}
构建bootJar
时,您可以使用
java -jar app.jar
,并使用java -jar app.jar anything #based on the condition you specified
作为命令行应用。
希望这会有所帮助。
编辑:
一种更好的方法是按以下方式更改Application.java并保持上面所示的ConsoleApplication.java。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
,然后将bootJar
与java -jar -Dspring.main.web-application-type=NONE app.jar
一起运行将把该应用程序作为控制台应用程序运行。并且不传递任何spring.main.web-application-type
将作为Web应用程序运行。