在 Vaadin 项目(Java Servlet 网络应用程序)中将 Flyway 迁移放在哪里?

Where to put Flyway migrations in a Vaadin project (Java Servlet web app)?

他们 Flyway migration files in a Vaadin 7 project created with the multi-module Maven archetype 放在哪里?

我将通过 Flyway 中的 Java API(不是命令行)激活迁移。

Vaadin 的解决方案是否适用于任何 Java Servlet based web app project running in a web container such as Tomcat or Jetty

更新

自 2018-06 年起,名为 vaadin-archetype-application-multimoduleVaadin 8 archetype 不再为 Web PagesMETA-INFWEB-INF 提供现有文件夹,如图所示下面的 Previously 部分。 WEB-INFclasses 文件夹是在构建时动态创建的。

查看您的 foobar-ui 模块的文件夹。找到 src > main > resources 文件夹层次结构。按照 Flyway 约定添加嵌套文件夹 db & migration

如果我们分解生成的 WAR 文件,我们会看到在构建过程中创建了一个 WEB-INF 文件夹,其中有一个嵌套的 classes 文件夹,我们可以在其中找到我们的 db > migration 包含我们第一个添加的 SQL 脚本文件的文件夹。

之前

Vaadin Ltd. 提供的多模块 Maven 原型的早期版本使用了与上述不同的安排。

嵌套在 WEB-INF

中的默认文件夹

默认情况下,Flyway 会找到您的 .sql 迁移文件,如果位于这个确切的文件夹路径中:

/WEB-INF/classes/db/migration/

在您的项目中,在 -ui 模块中,找到 WEB-INF 文件夹。 Java Servlet 规范将此特殊文件夹定义为存储 class 文件、.jar 文件和其他资源的地方,这些文件应该可供您的 servlet 使用,但始终与外部隔离,永远不会作为 public Web 应用程序的一部分。

WEB-INF 文件夹将包含 classeslib 文件夹。您可能还没有在 IDE 的项目视图中看到这两个文件夹。这两个特殊文件夹是在编译和构建过程中创建的。第一个包含 .class 用于您的 Web 应用程序的文件,而 lib 包含 .jar 文件。同样,所有这些都是由 Servlet 规范定义的。

技巧: 如果 IDE 未显示,请手动创建 classes 文件夹。在 compiling/build 过程中创建时,您放入其中的内容将自动与发往 classes 文件夹的其他内容合并。

默认情况下,Flyway 在 class 路径上查找完全命名为 /db/migration/ 的层次结构。因此,在您添加到 WEB-INFclasses 文件夹中按这些名称创建文件夹。现在,当 Flyway 在运行时查找 classpath 时,Flyway 将查找 /WEB-INF/classes 并找到 /db/migration/

所以在你的 IDE:

  1. 在项目的 WEB-INF 中创建一个名为 classes 的文件夹。
  2. 创建一个名为 db 的嵌套文件夹。
  3. 创建一个名为 migration 的嵌套文件夹。
  4. 将您的 .sql 文件放在 migration 文件夹中。

运行 您的 Flyway 迁移。下面是使用 H2 Database 在我的 class 实现 [ServletContextListener][3]contextInitialized 方法中调用的示例代码。

Flyway flyway = new Flyway ();
flyway.setDataSource ( "jdbc:h2:~/test" , "scott" , "tiger" );
flyway.migrate ();

警告

对这个答案持保留态度,因为我是 Flyway 的新手。但这对我有用 Flyway 4, Vaadin 7.6.4, Java 1.8 Update 77, NetBeans 8.1, Apache Tomcat 8.0.27, Mac OS X El Capitan.