在Sprint引导Web应用程序中运行脚本

时间:2016-09-19 20:02:47

标签: java spring spring-mvc spring-boot war

我将Spring Boot Web应用程序打包为WAR文件,我希望能够按需运行某些任务(脚本或命令)。例如:

  • 初始化数据库架构
  • 以编程方式以编程方式
  • 对数据库进行种子设定
  • 新版本应用程序(移动文件,数据库操作等)所需的数据迁移
  • 验证存储文件和数据库内容之间的数据完整性

这些"命令"如果他们可以访问与Web应用程序相同的bean(服务,DAO)和模型,则会更容易实现。我希望我必须在某处创建一个Spring应用程序上下文。我还希望将这些命令与应用程序的其余部分打包在一起,以便与它一起进行测试并易于部署。

基本上,我想知道如何实现与Laravel's artisan commands(PHP)类似的东西。

我已阅读过关于在WAR herehere内运行类的内容。我正在寻找" Spring方式"包装和运行命令。我必须为此集成Spring Batch jobs吗?据我所知,Spring Batch适用于较大的工作负载,可以分批分批。我应该咬紧牙关并将命令放在引用第一个的第二个单独的maven模块中吗?

更新

我实现了一个ApplicationRunner(感谢Stefan!),看看它们是如何工作的,并发现它们在Spring应用程序上下文刷新后运行。这意味着整个Web应用程序在跑步者执行之前已初始化并处于活动状态。这包括MVC端点映射器和配置中定义的计划任务。虽然这肯定是有用的,但我需要在所有不活动的情况下运行命令,因为它可能与命令冲突(特别是在命令运行期间的瞬态数据状态)。

更新2

我只需要创建另一个使用CommandLineRunner创建Spring Boot应用程序的可执行jar。如果我使用3个模块,这可以引用Web应用程序中的所有bean:

  1. 春天"服务"豆模块
  2. 网络应用程序模块
  3. 命令行运行程序模块

2 个答案:

答案 0 :(得分:4)

您可以使用ApplicationRunner 见spring boot application runner。 在应用程序启动后执行跑步者,您可以访问弹簧上下文。

CommandLineRunner类正是用于此目的。另请参阅How does a Spring Boot console based application work?

答案 1 :(得分:0)

通过使用弹簧数据jpa,您可以轻松实现此目的

1 - 通过开发代表数据库模式的实体类并设置属性spring.jpa.hibernate.ddl-auto = create,在运行应用程序时将为您创建模式(小心,因为每次你运行模式将被删除并为您重新创建)

2 - 你可以在import.sql中包含任何sql语句,这些语句应该放在带有配置文件的resources文件夹中(它是一个休眠功能,但在spring时仍能正常工作)。

initialize database with jpa

initialize database with hibernate