如何将弹簧引导应用程序作为Web应用程序以及命令行应用程序运行?

目前,我正在尝试使用 以及 同时运行 spring boot 应用程序,默认情况下既可以作为 Web 应用程序运行,也可以根据需要作为独立的命令行应用程序(通过某种命令行参数)。我正在努力弄清楚如何在提供程序参数时仅将其作为控制台应用程序运行。请任何建议会有所帮助。CommandLineRunnerConfigurableApplicationContext


答案 1

我有同样的要求。这就是我能够实现它的方式:

@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 *********************************");
    }
}

生成 时,可以使用 将应用程序作为 Web 应用运行,并使用 作为命令行应用运行。bootJarjava -jar app.jarjava -jar app.jar anything #based on the condition you specified

希望这有帮助。

编辑:

实现此目的的更好方法是更改应用程序.java如下所示,并保持控制台应用程序.java如上所示。

@SpringBootApplication
public class Application {

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

然后运行您的 with 将作为控制台应用程序运行该应用程序。并且不传递任何将作为Web应用程序运行。bootJarjava -jar -Dspring.main.web-application-type=NONE app.jarspring.main.web-application-type


答案 2

该接口提供了一种在应用程序启动后获取命令行参数的有用方法,但它无助于更改应用程序的性质。正如您可能已经发现的那样,应用程序可能不会退出,因为它认为它需要处理传入的Web请求。CommandLineRunner

你在你的主要方法中采取的方法在我看来是明智的。您需要告诉Spring Boot它不是Web应用程序,因此一旦启动,就不应该四处侦听传入的请求。

我会做这样的事情:

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(AutoDbServiceApplication.class);
    application.setWeb(ObjectUtils.isEmpty(args);
    application.run(args);
}

这应该以正确的模式启动应用程序。然后,您可以像现在一样使用Bean。您可能还想看看哪个具有稍微好一点的API:CommandLineRunnerApplicationRunner

@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”)) {
            // …
        }
    }

}

如果您真的不希望创建Bean,则可以考虑在main方法中设置配置文件,以便以后使用(请参阅)。AutoDbApplicationRunnerSpringApplication.setAdditionalProfiles