2010-10-29 3 views
0

J'apprends OSGi et je suis curieux de connaître la situation suivante:Comment puis-je mettre à jour les interfaces dans OSGI?

Je veux changer (étendre surtout) une interface exposée par OSGi, sans changer le nom de la classe. Est-il possible de faire un bundle qui "traduit" l'ancienne interface à la nouvelle. Ci-dessous est un exemple, j'espère que c'est assez clair, juste en utilisant quelques en-têtes manifestes. Supposons que j'ai ces faisceaux OSGI:

Bundle-Name: Example Iface1 Implementation 
Import-Package: org.osgi.framework 
Export-Package: example.interfaces;version="1.0" 

Bundle-Name: Example Iface1 User 
Import-Package: org.osgi.framework, example.interfaces;version="1.0" 

Mais je dois mettre à jour l'interface exposée (s). Les noms de classe d'interface restent les mêmes, mais des fonctionnalités leur sont ajoutées. Je crée:

Bundle-Name: Example Iface2 Implementation 
Import-Package: org.osgi.framework 
Export-Package: example.interfaces;version="2.0" 

Puis-je faire un bunlde comme celui-ci pour traduire la nouvelle interface à l'ancienne pour les paquets qui en ont besoin?

Bundle-Name: Interface Translator 
Import-Package: org.osgi.framework, example.interfaces;version="2.0" 
Export-Package: example.interfaces;version="1.0" 

Parce que dans ce cas, je ne sais pas comment faire les importations en java ...

Ou est-il une meilleure façon de faire face à cette situation dans OSGi?

Répondre

3

Il n'est pas nécessaire de le faire, mais vous devez spécifier vos versions correctement.

Votre première version de l'ensemble exporte "example.interfaces" version 1.0. C'est bon. Le groupe d'utilisateurs doit importer la version "[1.0, 2.0)". En d'autres termes, 1.0 jusqu'à la version 2.0.

Maintenant, vous dites que vous voulez ajouter des méthodes aux interfaces. Ce genre de changement est rétrocompatible pour les consommateurs de l'interface mais pas pour les producteurs. La façon d'indiquer ce genre de changement est de faire tomber la deuxième partie de la version, c'est-à-dire le segment "mineur". Donc, votre bundle d'interfaces mis à jour devrait exporter "example.interfaces" version 1.1.

Maintenant, votre nouvelle version de l'interface peut être utilisée directement par le groupe d'utilisateurs, car 1.1 se situe dans la plage [1.0, 2.0). Il n'est pas nécessaire d'exporter la même interface que 1.0 - en fait, vous NE DEVEZ PAS le faire, car cela impliquerait que l'interface n'a pas changé. Mais il a changé, d'une manière inverse et incompatible avec les producteurs. Par exemple, supposons que vous ayez un regroupement de producteurs qui implémente l'interface d'origine. Il doit utiliser la plage d'importation suivante: [1.0, 1.1). Ce bundle ne doit PAS voir l'interface mise à jour car il ne pourrait pas implémenter les nouvelles méthodes, et en effet il ne verra pas l'interface mise à jour car 1.1 est en dehors de la plage [1.0, 1.1). Si vous écrivez un nouveau producteur qui supporte l'interface mise à jour, il doit utiliser la plage [1.1, 1.2).

Veuillez lire le OSGi Semantic Versioning paper (avertissement PDF) pour plus de détails sur la façon de spécifier vos versions d'exportation et vos plages d'importation.

+0

Je ne connaissais pas les versions sémantiques. Cela offre une bonne approche dans la plupart des cas! Cependant, je me demande toujours s'il y a un moyen de "traduire" entre les changements de versions majeures. De tels changements sont rétrocompatibles, mais il pourrait y avoir un moyen de contourner cela. –

Questions connexes