2009-06-18 3 views
3

Dans mon application hôte j'ai essayé d'implémenter un simple pushService, qui doit être utilisé pour transférer une instance d'une classe nommée Vehicle au monde OSGi , en fournissant une méthode set et get. Pour pouvoir utiliser le service, a exporté à la fois l'interface de service et la classe Vehicle dans un fichier jar et a importé ce fichier dans l'ensemble, qui devrait utiliser le service.OSGi felix: Partage d'une classe entre l'application hôte et un bundle possible?

Chaque fois que j'ai essayé d'utiliser la classe Vehicle dans mon application hôte, qui instancie le framework felix, et le bundle, j'ai une erreur de liaison . Après avoir lu l'entrée de blog suivante (http://frankkieviet.blogspot.com/2009/03/javalanglinkageerror-loader-constraint.html) J'ai compris pourquoi cette erreur se produit. Mais je n'ai aucune idée de comment résoudre mon problème.

Est-il possible de partager une classe entre l'application hôte et une instance OSGi ? Peut-être que je dois utiliser la réflexion au lieu d'importer le fichier jar? J'ai eu un coup d'œil à cette bibliothèque (http://code.google.com/p/transloader/) et je ne suis certainement pas vraiment si cette lib est en mesure de résoudre mon problème ou non ...

BR,

Markus

+0

+1. En fait, j'ai un problème assez similaire et je n'ai pas été capable de le résoudre jusqu'à maintenant. Merci pour le lien vers transloader, il semble plutôt prometteur. – HerdplattenToni

Répondre

2

À un temps que j'utilisais Felix pour faire EXACTEMENT ce que vous demandez dans une application client-serveur personnalisée. Depuis, je suis passé à Equinox (ils implémentent correctement les fragments de framework dont j'avais besoin pour balancer LAF en tant que bundles osgi). I PENSEZ ce qui suit fonctionnera dans Felix, je KNOW cela fonctionne dans Equinox. MISE À JOUR: J'ai démarré un chemin très similaire avec mon application hôte. J'ai réalisé très tôt que je devais déplacer autant de code que possible dans de véritables paquets OSGi pour vraiment profiter de la plate-forme. Mon application hôte configure les communications client/serveur et synchronise les ensembles; c'est tout. Les quelques cours que j'avais l'habitude de partager ont été déplacés en bundle et je n'ai pas regardé en arrière. Si vous concevez/application peut prendre en charge ayant la majorité du code dans les paquets, je serais certainement aller dans cette voie. Même si une refonte est nécessaire, cela en vaut la peine. Avant d'initialiser le moteur d'exécution OSGi, définissez cette propriété "org.osgi.framework.system.packages" pour inclure les packages (sans caractères génériques) séparés par des points-virgules ";". Vous pouvez également inclure les paquets osgi de base, "org.osgi.framework" et les services de base "org.osgi.packageadmin", "org.osgi.startlevel", "org.osgi.url".

Je viens perçai mon contrôle de version et a trouvé un extrait quand j'utilisais encore Felix (la configuration est presque la même pour Equinox)

Map<String, String> configMap = new HashMap<String, String(); 

configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES, 
    "your.package;other.package;org.osgi.framework"); 

// setup other properties 

Bundle systemBundle = new Felix(configMap, null); 
systemBundle.start(); 

// Now you can use classes from "your.package" with explicity 
// declaring them as imports in bundles 
+0

Mhhh. Après avoir ajouté cette ligne "\t \t configMap.put (FelixConstants.FRAMEWORK_SYSTEMPACKAGES, " canEmulator.SumoVehicle; org.osgi.startlevel; org.osgi.framework; org.osgi.packageadmin; org.osgi.startlevel; org.osgi. url "); \t \t" Le mécanisme de démarrage automatique du bundle ne fonctionne plus: org.osgi.framework.BundleException: contrainte non résolue dans le bundle 1: package; (& (paquet = org.osgi.service.startlevel) (version> = 1.1.0)) Peut-être que j'ai besoin de définir un autre paquet, aussi? – Markus

+0

Que se passe-t-il si vous listez uniquement votre paquet et non les paquets osgi de base?Side note: Travaillez-vous sur un paquet à l'interface avec un système CAN Verhicle? Y at-il du matériel? Quelle plateforme? – basszero

+0

J'ai résolu le problème par moi-même. J'ai dû donner le nom du paquet ainsi qu'une version. Maintenant, je suis capable d'utiliser les classes fournies par mon bundle des deux côtés. Merci :) Pour ma masterthesis j'écris un environnement pour tester des applications de VANET. En utilisant cet environnement, il sera possible d'exécuter une application OSGi sur les véhicules simulés avec le simulateur de trafic open source SUMO. – Markus

Questions connexes