我们有一个由许多单独的插件构建的 RCP 应用程序,这些插件将应用程序数据保存和恢复到由多个表组成的单个用户可选数据库中。随着时间的推移,数据库格式会发生变化,我们希望能够使用 Flyway 数据库迁移来管理这些更改。
一种解决方案是让每个插件执行自己的迁移(即在每个插件中调用 Flyway.migrate (,但这有一个缺点,即如果数据库中的表由多个插件共享,那么排序插件之间迁移调用的执行顺序成为关键和问题。
更好的解决方案是进行单个 Migrate 调用,但问题就变成了如何将 Java 迁移脚本的类路径提供给 Flyway 实例,特别是考虑到由于延迟加载具有所需迁移代码的 Eclipse 插件类可能尚未加载。对于基于 SQL 的迁移脚本来说,这不是问题,因为 API 支持这一点 - 它不支持基于类路径的搜索。
那么问题来了,有没有办法确保当从单个插件调用 Flyway.migrate(( 时,迁移脚本的所有类路径都可以被 flyway 扫描程序类发现?
任何建议非常感谢...
这类问题通常通过基于 RCP/插件的应用程序中的扩展点和扩展来解决。
例如,迁移插件可以定义一个扩展点migrationScript
,该扩展点能够指定用于迁移数据库架构的 SQL 代码。然后,各个插件可以自由地向此扩展贡献迁移脚本。
<extension point="org.example.migrationScript">
<script sql="alter table ..." />
</extension>
在运行时,迁移插件可以使用 IExtensionRegistry 读取所有migrationScript
扩展。RCP 运行时确保读取所有已安装插件的扩展,并在必要时激活贡献插件(例如,如果调用其代码(。
如果迁移需要贡献 Java 代码,则迁移插件可以定义一个接口或抽象类,贡献插件可以为这些接口或抽象类提供具体的实现。
例如,迁移插件定义了此接口:
interface ScriptProvider {
String sql();
}
。单个插件为迁移贡献了自己的份额
<extension point="org.example.migrationScript">
<script class="org.example.MyScriptProvider" />
</extension>
public class MyScriptProvider {
public String sql() { return "alter table ..."; }
}
类路径和必要插件的激活分别由 RCP 运行时和 OSGi 管理。