使用 Flyway 和从 Eclipse 插件构建的 RCP

Use of Flyway with RCP built from Eclipse plugins

我们有一个由许多单独的插件构建的 RCP 应用程序,这些插件将应用程序数据保存和恢复到一个由多个表组成的用户可选择的数据库中。随着时间的推移,数据库格式发生变化,我们希望能够通过使用 Flyway 数据库迁移来管理这些变化。

一个解决方案是让每个插件执行自己的迁移(即在每个插件中调用 Flyway.migrate)但是这样做的缺点是如果数据库中的表被多个插件共享然后订购插件之间迁移调用的执行顺序成为关键和问题。

更好的解决方案是进行一次 Migrate 调用,但问题就变成了如何将 Java 迁移脚本的类路径提供给 Flyway 实例,尤其是考虑到 Eclipse 的延迟加载具有所需迁移代码的插件 类 可能尚未加载。这对于基于 SQL 的迁移脚本来说不是问题,因为 API 支持这个 - 它不支持基于类路径的搜索。

那么问题是有没有一种方法可以确保当从单个插件调用 Flyway.migrate() 时,迁移脚本的所有类路径都可以被 flyway 扫描器 类 发现?

非常感谢任何建议...

这类问题通常在基于 RCP/plug-in 的应用程序中用 extension points and extensions 解决。

例如,迁移插件可以定义一个扩展点migrationScript,它能够指定SQL代码来迁移数据库模式。然后各个插件可以免费为这个扩展贡献迁移脚本。

<extension point="org.example.migrationScript">
  <script sql="alter table ..." />
</extension>

在运行时,迁移插件可以使用IExtensionRegistry读取所有migrationScript扩展。 RCP 运行时确保读取所有已安装插件的扩展并在必要时激活贡献插件(例如,如果调用它们的代码)。

如果迁移需要贡献Java代码,迁移插件可以定义一个接口或抽象class,贡献插件可以为其提供具体实现。

比如迁移插件定义了这个接口:

interface ScriptProvider {
  String sql();
}

...和各个插件为迁移贡献自己的份额

<extension point="org.example.migrationScript">
  <script class="org.example.MyScriptProvider" />
</extension>

public class MyScriptProvider {
  public String sql() { return "alter table ..."; }
}

class必要插件的路径和激活分别由 RCP 运行时和 OSGi 管理。