Domanda

All'interno della mia applicazione host ho provato a implementare un semplice pushService, che deve essere utilizzato per trasferire un'istanza di una classe denominata Veicolo nell'OSGi mondo, fornendo un metodo set e get. Per poter utilizzare il servizio I esportato sia l'interfaccia di servizio che la classe Vehicle in un file jar e importato quel file all'interno del bundle, che dovrebbe usare il servizio.

Ogni volta che ho provato a utilizzare la classe Vehicle nell'applicazione host, che istanzia il framework felix e il bundle, ho ottenuto un collegamento errore. Dopo aver letto il seguente post di blog ( http://frankkieviet.blogspot.com/2009/03/javalanglinkageerror -loader-constraint.html) Ho capito perché si verifica questo errore. Ma non ho idea di come risolvere il mio problema.

È possibile condividere una classe tra l'applicazione host e un OSGi esempio? Forse devo usare reflection invece di importare il file jar? Ho dato un'occhiata a quella biblioteca ( http://code.google.com/p/transloader/ ) e non sono sicuro che questa libreria sia in grado di risolvere il mio problema o meno ...

BR,

Markus

È stato utile?

Soluzione

Un tempo stavo usando Felix per fare ESATTAMENTE quello che stai chiedendo in un'applicazione client-server personalizzata. Da allora sono passato a Equinox (implementano correttamente i frammenti di framework di cui avevo bisogno per swing LAF come bundle osgi). PENSI che funzionerà in Felix, CONOSCI funziona in Equinox.

AGGIORNAMENTO: ho iniziato un percorso molto simile con la mia applicazione host. Ho capito presto che dovevo spostare il maggior codice possibile in veri e propri bundle OSGi per sfruttare veramente la piattaforma. La mia applicazione host imposta le comunicazioni client / server e sincronizza i bundle; questo è tutto. Le poche classi che condividevo sono state spostate in bundle e non ho guardato indietro. Se la progettazione / l'applicazione può supportare la maggior parte del codice in bundle, farei sicuramente quella strada. Anche se è necessaria una riprogettazione, ne vale la pena.

Prima di inizializzare il runtime OSGi, imposta questa proprietà " org.osgi.framework.system.packages " per includere i pacchetti (senza caratteri jolly) separati da punti e virgola "virgola". Potrebbe inoltre essere necessario includere i pacchetti osgi di base, " org.osgi.framework " e i servizi di base " org.osgi.packageadmin " ;, " org.osgi.startlevel " ;, " org.osgi.url " ;.

Ho appena esaminato il controllo della versione e ho trovato uno snippet mentre stavo ancora usando Felix (l'installazione è quasi la stessa per 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top