Question

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 vers l'OSGi monde, en fournissant un ensemble et obtenir la méthode. Pour pouvoir utiliser le service, je exporté à la fois l'interface de service et la classe Vehicle dans un fichier jar et importé ce fichier dans le paquet, qui devrait utiliser le service.

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 eu un lien Erreur. 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 ne sais pas comment résoudre mon problème.

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

BR,

Markus

Était-ce utile?

La solution

À une époque, j’utilisais Felix pour EXACTEMENT ce que vous demandiez 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 sous forme de bundles osgi). Je PENSE ce qui suit fonctionnera sous Felix, je SAIS que cela fonctionne sous Equinox.

UPDATE: J'ai commencé un chemin très similaire avec mon application hôte. J'ai réalisé très tôt que je devais intégrer autant de code que possible dans de véritables bundles OSGi pour vraiment tirer parti de la plate-forme. Mon application hôte configure les communications client / serveur et synchronise les offres groupées. c'est tout. Les quelques classes que je partageais auparavant ont été déplacées en bundle et je n'ai pas regardé en arrière. Si votre conception / application peut prendre en charge le fait d'avoir la majorité du code dans des ensembles, je choisirais certainement cette voie. Même si certaines modifications sont nécessaires, cela en vaut la peine.

Avant d’initialiser le runtime OSGi, définissez cette propriété " org.osgi.framework.system.packages " pour vous inclure des paquets (pas de jokers) séparés par des points-virgules ";"; Vous devrez peut-être également inclure les packages osgi de base, "org.osgi.framework". et les services de base "org.osgi.packageadmin", "org.osgi.startlevel", "org.osgi.url".

Je viens de fouiller dans le contrôle de version et de trouver un extrait alors que j'utilisais encore Felix (la configuration est presque identique 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
scroll top