在 websphere 上的 flyway 迁移上找不到位置

Posted

技术标签:

【中文标题】在 websphere 上的 flyway 迁移上找不到位置【英文标题】:Location not found on flyway migrate on websphere 【发布时间】:2018-05-26 07:56:05 【问题描述】:

我正在尝试在 Websphere 服务器上设置 flyway-migration。

我的项目由以下模块组成:

 --projectwar.war
     --projectsql.jar
          --java
              --MyFlywayUtil.class
          -- resources
               -- myscripts
     --projectmodel.jar
           --java
                --MyRiskDataSourceConfig.class

MyRiskDataSourceConfig 包含 flyway 迁移声明:

@Bean(initMethod = "migrate")
public Flyway flyway(@Qualifier("myDataSource") DataSource dataSource) 
    Flyway flyway = new Flyway();
    flyway.setBaselineOnMigrate(true);
    flyway.setClassLoader(MyFlywayUtil.class.getClassLoader());
    flyway.setLocations("classpath:"+"myscripts");
    flyway.setDataSource(dataSource);
    return flyway;

在 Tomcat 下使用 bootRun 命令执行时,迁移工作正常并找到位置。

但是在 Websphere 下我收到以下信息:

com.ibm.ws.classloader.CompoundClassLoader@bb6f8b91[app]
Local ClassPath 
/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/cell01/project.ear/project.war/WEB-INF/classes 
/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/cell01/project.ear/project.war/WEB-INF/lib/projectmodel.jar 
/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/cell01/project.ear/project.war/WEB-INF/lib/projectsql.jar 
/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/cell01/project.ear/project.war 

Parent com.ibm.ws.classloader.ProtectionClassLoader@c26663d6 Delegation Mode  PARENT_FIRST) 
On WebSphere an empty file named flyway.location must be present on the classpath location for WebSphere to find it!
o.f.c.i.u.s.classpath.ClassPathScanner Unable to resolve location classpath myscripts

我已经尝试过使用和不使用 flyway.setClassLoader();

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您是否还向包含您的迁移的文件夹中添加了一个名为 flyway.location 的(空)文件,在我的情况下,这解决了问题。

由于 IBM 类加载器的工作方式,必须将此文件添加为解决方法,另请参阅 source

当然还有给出的警告:

在 WebSphere 上,名为 flyway.location 的空文件必须存在于类路径位置,WebSphere 才能找到它!

【讨论】:

哇,这么脏的代码。感谢您的提示,稍后会检查 为我工作。我正在使用 flyway 5.2.4 我的 flyway 位置在 application.properties 中配置,如下所示: spring.flyway.locations=classpath:db/flywaymigration 。所以我只是把空的 flyway.location 文件放在那里,然后 WAS 可以找到它们。感谢您的解决方案,节省了很多时间!【参考方案2】:

根据这个git issue,问题已在flyway 4.0.1中修复

【讨论】:

我使用的是 4.2.0 版本

以上是关于在 websphere 上的 flyway 迁移上找不到位置的主要内容,如果未能解决你的问题,请参考以下文章

现有数据库上的 flyway 迁移导致“列中遇到错误的列类型”

检测到的已解决迁移未应用于 flyway 上的数据库

如何在 SQL Server 上的 Flyway 中禁用单个迁移的事务

实战Flyway迁移指南最佳实践

通过詹金斯上的 Maven 作业导致的飞路迁移错误

Java基础学习总结(183)—— Flyway 在项目中迁移数据实践