Flyway 错误地加载和执行已部署耳朵 "each ejb module" 的迁移定义

Flyway wrongly load and execute migration definitions of "each ejb module" of deployed ear

我遇到了一个奇怪的问题,我有一个带有一些 ejb 模块的 JEE7 应用程序,在每个 ejb 模块中我都有一组 flyway sql 迁移(我的应用程序 运行s在 glassfish 4.0.1).

当我在第一个 ejb 模块(在 src/main/resources/db/migration 下)创建一个新的 sql 迁移时,其他模块尝试执行新的 sql 迁移(但是这个新的迁移不是出现在其他 ejb 模块中 !!!)。

似乎 flyway 试图加载它在 "db/migration" 资源上找到的所有迁移的列表,并错误地将所有 ejb 模块的迁移收集到 ear intead 中以加载给定 ejb 模块的迁移。 .

示例:

带 2 个模块的耳朵:

ejb module 1
ejb module 2

ejb 模块 1 迁移:

V1.00.20142912191315__create_tables.sql (BASELINE)
V1.00.20150108173546__new_fields_and_tables.sql (PENDING)

ejb 模块 2 迁移:

V1.00.20142912191315__create_tables.sql (BASELINE)

当我重新部署 ear 时,ejb 模块 1 的迁移 V1.00.20150108173546__new_fields_and_tables.sql 已成功执行,但 ejb 模块 2 错误地尝试 运行 相同的迁移 V1.00.20150108173546__new_fields_and_tables.sql 存在于 ejb 模块 1...

我不明白为什么会这样以及如何解决这个问题。

谁能帮帮我?

非常感谢...

Flyway 默认使用上下文 class 加载程序,在您的情况下,它似乎对所有 EJB 模块具有可见性。您可以使用 Flyway.setClassLoader() 指定不同的(特定于模块的)class 加载程序,以将扫描限制为仅对该加载程序可见的资源。

我已经解决了这个问题,只需将每个 EJB 模块的迁移放在单独的文件夹中即可,例如:

  • ejb 模块 1:将定义迁移到 db.migration.module1 文件夹
  • ejb 模块 2:将定义迁移到 db.migration.module2 文件夹
  • 等等...

然后在每个 ejb 模块上指定通过 flyway 加载迁移定义的位置 "locations" 属性 例如:

  • ejb 模块 1:flyway.setLocations("db/migration/module1");
  • ejb 模块 2:flyway.setLocations("db/migration/module2");
  • 等等...

所以我可以将多个 ejb 放入一只耳朵,每个 ejb 加载并运行拥有的迁移...

希望这对任何人都有帮助...

干杯。

PS:感谢 Eddy Gasparotto 的宝贵帮助!!!