2017-08-17 22 views
0

複数の個々のプラグインからアプリケーションを作成し、いくつかのテーブルで構成されたユーザー選択可能なデータベースにアプリケーションデータを保存するRCPアプリケーションがあります。時間が経つにつれて、データベース形式が変わり、Flywayデータベースの移行を使用してこれらの変更を管理したいと考えています。Eclipseプラグインから構築されたRCPでFlywayを使用

1つの解決策は、各プラグインが独自の移行を実行することです(つまり各プラグインでFlyway.migrateを呼び出します)。ただし、データベース内のテーブルが複数のプラグインで共有されている場合、プラグイン間のマイグレーション・コールが問題となります。

より良い解決策は、単一のMigrate呼び出しを持つことですが、問題は、Javaの移行スクリプトのクラスパスをFlywayインスタンスに与える方法になります。特に、Eclipseプラグインクラスの遅延ロード必要な移行コードがまだロードされていない可能性があります。これは、APIがこれをサポートするため、SQLベースの移行スクリプトでは問題にはなりません。クラスパスベースの検索ではサポートされていません。

問題は、Flyway.migrate()が単一のプラグインから呼び出されたときに、マイグレーションスクリプトのすべてのクラスパスがフライウェイスキャナクラスによって検出可能になるようにする方法がありますか?

大幅理解任意の提案...

+0

各Eclipseプラグインには、依存関係のみを含む独自の別のクラスパスがあります。あなたはクラスパスを使って他のプラグインで物事を見つけることはできません。 –

答えて

0

問題の種類は、通常、RCP /プラグイン・ベースのアプリケーションにextension points and extensionsで解決されます。

たとえば、移行プラグインでは、データベース・スキーマを移行するSQLコードを指定できる拡張ポイントmigrationScriptを定義できます。その後、個々のプラグインは、この拡張に移行スクリプトを自由に提供できます。

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

実行時には、移行プラグインはすべてmigrationScriptの拡張機能を読み込むためにIExtensionRegistryを使用することができます。 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はクラスパスが各プラグイン/バンドルにローカライズされているので、寄稿しているすべてのバンドルのローダーを管理するuberクラスパスローダーを作成する必要があります。これはOsgiClassPathLocationScannerに問題が発生しクラスパスの前に"bin /" –

+0

クラスパスを手動で管理する必要はありません。私の編集された答えを見てください。 –

関連する問題