|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre habitué
![]() Inscription : juillet 2006 Messages : 690 ![]() |
Bonjour à tous
J'ai un sérieux pb. J'espère que qq'un pourra m'aider (George7 ? J'essaie de consommer un service du projet plugin dans mon projet Core mais Code :
refs = context.getServiceReferences(SimpleShape.class.getName(), null); Voici mon code (Je simplifie au max. J'espère ne pas oublier de bout de code important) : PROJET CORE SimpleShape.java (une simple interface) Code :
Code :
PROJET PLUGIN Activator.java Code :
Merci beaucoup. Je suis vraiment a court d'idées
__________________
https://www.weetool.com |
||||||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : août 2006 Messages : 1 234 ![]() |
Salut,
(désolé du temps de réponse mais je rentre tout juste de vacances A priori ça me parait correct comme code... Ceci dit une première question : ton interface SimpleShape se trouve bien uniquement dans ton bundle core est est exportée par celui ci et importée par ton bundle plugin ? Si ton bundle plugin contient aussi l'interface, cela ne peut pas marcher car chaque bundle ayant un classloader différent, les objets Class retournés pour enregistrer dans plugin et récupérer le serservice dans core sont différents. Ensuite tu es sûr que ton plugin est démarré ? puis ton core ? Pour réaliser ce que tu veux il vaut mieux utiliser un ServiceTracker pour car si au moment du démarrage de core, aucun service SimpleShape n'est enregistré (plugin démarre après core, par exemple) il est normal que tu reçoives toujours null comme service. Je vois que tu utilises un ServiceTracker mais que fait-il ? je n'ai pas l'environnement sous la main pour montrer comment je ferais, mais si tu peux attendre ce soir ou demain je te montre volontiers A plus
__________________
"Ikea / furnishing = OSGi / software : They allow to have very modular things, but trying to put them together generally drives you crazy" -- Mario Fusco Pour vos développements Java : apprenez à utiliser la javadoc |
|
00
|
|
|
#3 | ||||
|
Membre habitué
![]() Inscription : juillet 2006 Messages : 690 ![]() |
Salut George7 et merci pour ta réponse.
En ce qui concerne mon interface SimpleShape, elle se trouve bien uniquement dans mon bundle core et est bien exportée. J'ai ensuite rajouté ce code dans le main de mon module core : Code :
Code :
__________________
https://www.weetool.com |
||||
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() ![]() Inscription : août 2006 Messages : 1 234 ![]() |
Pour en revenir au point précédemment abordé : nommer en dur les plugin dans le code est contre l'idée de la modularité OSGi
Sinon ce que je ferais : dans mon bundle core lors du démarrage, je démarre un ServiceTracker perso qui traque les services de type SimpleShape Ce que je ferais est dans dans mon Activator du bundle core Code :
Ensuite peu importe l'ordre dans lequel les modules sont démarrés, dès que tu enregistreras un service de type SimpleShape, ton core appellera la méthode draw. Tu peux donc retirer les deux lignes moches avec les bundles en dur de ta configuration. J'ai testé chez moi et ça marche
__________________
"Ikea / furnishing = OSGi / software : They allow to have very modular things, but trying to put them together generally drives you crazy" -- Mario Fusco Pour vos développements Java : apprenez à utiliser la javadoc |
||
|
00
|
|
|
#5 |
|
Membre habitué
![]() Inscription : juillet 2006 Messages : 690 ![]() |
Ok super merci George, je regarde ça demain, dès la première heure.
![]() En fait, les lignes en dur, je l'ai avais mis juste pour faire des tests, ne t'inquiète pas. J'ai bien retenu ce que tu m'avais dit.
__________________
https://www.weetool.com |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Inscription : août 2006 Messages : 1 234 ![]() |
Attention interrogation écrite demain
__________________
"Ikea / furnishing = OSGi / software : They allow to have very modular things, but trying to put them together generally drives you crazy" -- Mario Fusco Pour vos développements Java : apprenez à utiliser la javadoc |
|
00
|
|
|
#7 |
|
Membre habitué
![]() Inscription : juillet 2004 Messages : 534 ![]() |
Salut,
Quels sont les bundles que tu as lancer a part ton project.core et project.plugin ? Pourquoi veux tu utiliser le serviceTracker pour une interface ? La plupart du temps, on exporte le bundle contenant les interfaces et on importe celui-ci dans son bundle d'implementation. Ensuite on publie l'implementation dans le registre. Si tu utilise Equinox, je te conseille d'utiliser Declarative Service (plus souple) au lieu du serviceTracker.(lourd à mettre en place) Ci-joint, un helloworld avec Equinox DS Pour faire fonctionner Equinox, il faut "org.eclipse.osgi.jar" et pour DS, il te faut "org.eclipse.equinox.ds.jar", "org.eclipse.osgi.services.jar" et "org.eclipse.equinox.util.jar" Même si tu n'utilises pas Equinox, tu auras un petit exemple: - d'import/export de bundle (myproject.service exporte ses interfaces / myproject.service.impl importe les interfaces) - de publication/consommation de service.(myproject.service.impl publie ses services / myproject.helloworld consomme les services) Et pour finir, un tutoriel qui explique parfaitement les béaba d'equinox pingoui |
|
|
00
|
|
|
#8 |
|
Membre habitué
![]() Inscription : juillet 2006 Messages : 690 ![]() |
Super George7, merci encore une fois pour ta réponse.
Ceci dit, un derrier point : Admettons en reprenant le code que tu as fourni, que la méthode draw (qui se trouve dans la méthode addingService de la classe MyTracker) renvoit un objet String. Je voudrais récuperer ce String dans le start de mon Coer et en faire ce que je veux. Est-ce possible ? J'espère que je suis assez clair. pingoui : merci pour ta réponse mais j'utilise Felix ![]() Merci
__________________
https://www.weetool.com |
|
|
00
|
|
|
#9 | |
|
Membre Expert
![]() ![]() Inscription : août 2006 Messages : 1 234 ![]() |
Citation:
Sans rire, il faut juste déplacer ta logique dans ce cas là, elle est dans le ServiceTracker et pas dans la méthode start du core. De toute façon une des recommandations en OSGi est d'avoir des méthodes start qui prennent le moins de temps possible, il ne faut pas mettre trop de logique. Imagine que tu as 100 bundles qui mettent chacun 100 ms à démarrer, tu as un temps de démarrage de 10 secondes déjà, les méthodes start sont appelées séquentiellement... @pingoui: les Declarative Services font partie de la spécification OSGi, donc sont utilisables sur toute implémentation implémentant la partie compendium de la spec. Ceci dit ils servent surtout à enregistrer des services il me semble pas à écouter l'apparition de nouveaux services ou leur disparition. Il me semble que le problème de identifiant_bidon est plus sur l'utilisation de services qui apparaissent que sur leur enregistrement
__________________
"Ikea / furnishing = OSGi / software : They allow to have very modular things, but trying to put them together generally drives you crazy" -- Mario Fusco Pour vos développements Java : apprenez à utiliser la javadoc |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com