Jakarta ee Flyway错误加载并执行迁移定义;每个ejb模块;外耳道

Jakarta ee Flyway错误加载并执行迁移定义;每个ejb模块;外耳道,jakarta-ee,glassfish,flyway,Jakarta Ee,Glassfish,Flyway,我面临一个奇怪的问题,我有一个带有一些ejb模块的JEE7应用程序,在每个ejb模块中我都有一组FlywaySQL迁移(我的应用程序运行在glassfish 4.0.1上) 当我在第一个ejb模块中创建一个新的sql迁移时(在src/main/resources/db/migration下),其他模块会尝试执行新的sql迁移(但是这个新迁移不会出现在其他ejb模块中!!!) 似乎flyway试图加载它在“db/migration”资源中找到的所有迁移的列表,并错误地将所有ejb模块的迁移收集到e

我面临一个奇怪的问题,我有一个带有一些ejb模块的JEE7应用程序,在每个ejb模块中我都有一组FlywaySQL迁移(我的应用程序运行在glassfish 4.0.1上)

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

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

例如:

ear具有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)
V1.00.20142912191315__create_tables.sql (BASELINE)
ejb模块2迁移:

V1.00.20142912191315__create_tables.sql (BASELINE)
V1.00.20150108173546__new_fields_and_tables.sql (PENDING)
V1.00.20142912191315__create_tables.sql (BASELINE)
当我重新部署ear时,成功执行了ejb模块1的迁移V1.00.20150108173546___新_字段_和_tables.sql,但ejb模块2错误地尝试运行ejb模块1上存在的相同迁移V1.00.20150108173546_新_字段_和_tables.sql

我不明白为什么会发生这种情况以及如何解决这个问题

有人能帮我吗


非常感谢…

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

我已经解决了这个问题,只需将每个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放在一个ear中,每个ejb都会加载并运行自己的迁移

希望这对任何人都有帮助

干杯


PS:感谢艾迪·加斯帕罗托的宝贵帮助

谢谢Axel也许你是对的,但是我不知道设置什么来绕过这个问题,我已经尝试设置flyway.setClassLoader(Thread.currentThread().getContextClassLoader());或flyway.setClassLoader(getClass().getClassLoader());但是问题仍然存在,你能把我引向正确的方向吗?似乎当我有一个EAR和多个EJB模块时,这些模块具有EAR类路径可见性,所以flyway从每个EJB模块中定义的每个db/迁移文件夹加载迁移定义,我不明白如何绕过这个问题,你能帮我吗?我想这是一个玻璃鱼专家的问题,我不是。