【问题标题】:How to run spring boot application both as a web application as well as a command line application?如何将 Spring Boot 应用程序作为 Web 应用程序和命令行应用程序运行?
【发布时间】:2018-01-18 19:43:46
【问题描述】:

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

【问题讨论】:

  • 您找到解决方案了吗?我正在解决完全相同的问题。谢谢。
  • @Artegon 你可以参考我下面的解决方案。

标签: java eclipse spring-boot command-line-arguments


【解决方案1】:

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

您在 main 方法中采用的方法在我看来是明智的。您需要告诉 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。您可能还想查看ApplicationRunner,它的 API 稍好一些:

@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)。

【讨论】:

  • 感谢菲尔·韦伯!
  • 这仍然是在 Spring Boot Web 应用程序中包含一些 CLI 命令的最佳方式吗?如果我使用 ApplicationRunner,是否可以在从“运行”返回并运行 CLI 命令后阻止 Web 应用程序启动?
【解决方案2】:

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

@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 时,您可以使用以下方式将应用程序作为 Web 应用程序运行 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);
    }
}

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

【讨论】:

  • 谢谢,上面的答案不是垃圾,也不一定是显而易见的。
猜你喜欢
  • 2012-10-26
  • 2019-08-27
  • 2020-10-26
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2017-01-16
  • 2018-05-08
  • 2017-12-26
相关资源
最近更新 更多