2017-08-17 24 views
0

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

一个解决方案是让每个插件执行自己的迁移(例如,在每个插件中调用Flyway.migrate),但这有一个缺点,即如果数据库中的表由多个插件共享,插件之间的迁移调用成为关键和问题。

更好的解决方案是进行单个Migrate调用,但问题在于如何将Java迁移脚本的类路径提供给Flyway实例,特别是由于Eclipse插件类的延迟加载所需的迁移代码可能尚未加载。这对于基于SQL的迁移脚本来说不是问题,因为API支持这一点 - 它不支持基于类路径的搜索。

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

不胜感激的任何建议...

+0

每个Eclipse插件都有其自己的单独的类路径,只包含它的依赖关系。您无法使用类路径在其他插件中找到内容。 –

回答

0

这类问题通常与extension points and extensions基于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管理。

+0

感谢 - 已经得出了这样的结论 - 尽管如果要使用java类来提供迁移贡献,这仍然是个问题;正如greg-449所说,类路径已经本地化为每个插件/软件包,因此您最终不得不创建一个超级类路径加载器来管理所有提供的软件包中的加载器 - 并且这是在您遇到OsgiClassPathLocationScanner问题之前必须预先安装类路径“bin /” –

+0

您不需要 - 也不应该 - 手动管理类路径。请看我编辑的答案。 –