2017-08-17 61 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

您不需要 - 也不應該 - 手動管理類路徑。請看我編輯的答案。 –