2017-08-17 3 views
0

Nous avons une application RCP construit à partir de nombreux plug-ins individuels qui sauvegarder et de restaurer les données d'application à une seule base de données sélectionnable par l'utilisateur composée de plusieurs tables. Au fil du temps, le format de la base de données change et nous voulons être en mesure de gérer ces changements en utilisant la migration de base de données Flyway. Une solution serait d'avoir chaque plugin effectuant sa propre migration (c.-à-d. Flyway.migrate dans chaque plugin), mais cela a l'inconvénient que si les tables de la base de données sont partagées par plus d'un plugin, alors l'ordre d'exécution de les appels de migration entre les plug-ins deviennent essentiels et problématiques. Une meilleure solution serait d'avoir un seul appel Migrate mais le problème devient alors de savoir comment alimenter les chemins de classes des scripts de migration Java vers l'instance de Flyway, étant donné qu'en raison du chargement paresseux des classes de plug-ins Eclipse avec le code de migration requis n'a peut-être pas encore été chargé. Ce n'est pas un problème pour les scripts de migration basés sur SQL car l'API le prend en charge - il ne le prend pas en charge pour la recherche basée sur classpath. La question est alors de savoir si Flyway.migrate() est appelé à partir d'un seul plug-in, tous les chemins de classe des scripts de migration peuvent être détectés par les classes de l'explorateur de voies de migration.Utilisation des voies de migration RCP construit à partir de plugins Eclipse

Toutes les suggestions très appréciées ...

+0

Chaque plug-in Eclipse a son propre chemin de classe séparée ne contenant que ses dépendances. Vous ne pouvez pas trouver de choses dans d'autres plugins en utilisant les chemins de classes. –

Répondre

0

Le genre de problème est généralement résolu avec extension points and extensions dans les applications RCP/plug-in. Par exemple, le plug-in de migration peut définir un point d'extension migrationScript capable de spécifier le code SQL pour migrer le schéma de base de données. Les plug-ins individuels sont alors libres de contribuer des scripts de migrations à cette extension.

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

Lors de l'exécution, le plug-in de migration peut utiliser le IExtensionRegistry pour lire toutes migrationScript extensions. Le temps d'exécution RCP assure que les extensions de tous les plug-ins installés sont lus et active les plugins qui contribuent au besoin (par exemple si leur code est invoqué).

Si la migration nécessite un code Java pour être contribué, le plug-in de migration peut définir une interface ou une classe abstraite pour laquelle les plug-ins contribuant peuvent fournir des applications concrètes.

Par exemple, le plug-in de migration définit cette interface:

interface ScriptProvider { 
    String sql(); 
} 

... et plug-ins individuels apportent leur part à la migration

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

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

Le chemin de classe et d'activation de plug-ins nécessaires sont gérés par le moteur d'exécution RCP et OSGi respectivement.

+0

Merci - nous sommes arrivés à cette conclusion - même si cela reste problématique si vous voulez utiliser une classe java pour fournir la contribution de migration; Comme greg-449 dit que les classpaths sont localisés à chaque plugin/bundle de sorte que vous finissez par devoir créer un chargeur de chemin de classe uber qui gère les chargeurs de tous les bundles contributeurs - et cela avant que vous n'ayez des problèmes avec OsgiClassPathLocationScanner "bin /" –

+0

Vous n'avez pas besoin - et vous ne devriez pas - gérer manuellement le classpath. S'il vous plaît voir ma réponse éditée. –