Frage

In meiner Host-Anwendung habe ich versucht, eine einfache Pushservice implementieren, die wird verwendet eine Instanz einer Klasse mit dem Namen Vehicle auf den OSGi zu übertragen Welt, indem sie eine Reihe Bereitstellung und Verfahren erhalten. Um den Service, den ich verwenden exportiert sowohl die Service-Schnittstelle und die Fahrzeugklasse in eine JAR-Datei und die Datei innerhalb des Bündels eingeführt, die den Dienst verwendet werden soll.

Jedes Mal wenn ich versuchte, die Fahrzeugklasse in meiner Host-Anwendung zu verwenden, das instanciates des felix Rahmen, und das Bündel, bekam ich eine Verknüpfung Error. Nach dem folgenden Blog-Eintrag lesen ( http://frankkieviet.blogspot.com/2009/03/javalanglinkageerror -Loader-constraint.html ) Ich verstand, warum dieser Fehler auftritt. Aber ich habe keine Ahnung, wie mein Problem zu lösen.

Ist es möglich, eine Klasse zwischen der Host-Anwendung und einer OSGi zu teilen Beispiel? Vielleicht muss ich Reflexion statt Import die JAR-Datei verwenden? Ich hatte einen Blick auf die Bibliothek ( http://code.google.com/p/transloader/ ), und ich bin nicht wirklich sicher, ob diese lib der Lage ist, mein Problem zu lösen oder nicht ...

BR,

Markus

War es hilfreich?

Lösung

Zu einer Zeit ich Felix wurde mit genau dem zu tun, was Sie in einer benutzerdefinierten Client-Server-Anwendung sind gefragt. Ich habe da zu Equinox geschaltet (sie richtig Rahmenfragmente implementieren, die ich für Swing LAF als OSGi-Bundles erforderlich). I THINK Folgendes wird in Felix arbeiten, I KNOW es funktioniert in Equinox.

UPDATE: Ich begann einen sehr ähnlichen Weg mit meiner Host-Anwendung herunter. Ich erkannte früh, dass ich brauchte, um so viel Code wie möglich in Echt OSGi-Bundles zu bewegen, um wirklich die Vorteile der Plattform zu nutzen. Meine Host-Anwendung richtet Client / Server-Comms und synchronisiert Bündel; das ist es. Die wenigen Klassen, die ich verwendet worden zu teilen in Bündel bewegt, und ich habe nicht zurückblicken. Wenn Sie Design / Anwendung kann die Mehrheit des Code unterstützt in Bündeln würde ich auf jeden Fall diesen Weg gehen. Auch wenn einige Redesign erforderlich ist, es lohnt sich.

Vor dem OSGi-Laufzeit initialisiert wird, setzen Sie diese Eigenschaft „org.osgi.framework.system.packages“ Sie Pakete enthalten (keine Platzhalter), getrennt durch Semikolons „;“. Sie können zusätzlich die Basis osgi Pakete beinhalten müssen „org.osgi.framework“ und die Basisdienstleistungen „org.osgi.packageadmin“, „org.osgi.startlevel“, „org.osgi.url“.

Ich grub nur durch meine Versionskontrolle und ein Snippet gefunden, als ich noch Felix mit (ist die Einrichtung fast das gleiche für 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top