2009-09-11 6 views
5

Sto lavorando a un bundle OSGi che implementa un servizio come wrapper su un eseguibile nativo. Cioè, il servizio esegue l'eseguibile con ProcessBuilder, lo alimenta alcuni dati e recupera il risultato. La mia domanda riguarda il modo migliore per impacchettare questo pacchetto. L'eseguibile nativo include un numero di file di dati dipendenti che devono essere tutti presenti sul disco per l'esecuzione dello strumento. Ho trovato moltissime referenze su come gestire DLL native in OSGi, ma nessuna che indirizzi i file associati a un bundle che devono essere presenti su disco anziché solo recuperabili attraverso il classpath.Includere risorse aggiuntive con i bundle OSGi

Stavo pensando che potrei includere i file dipendenti e dipendenti direttamente nell'archivio del bundle e quindi estrarlo a livello di codice in qualche directory quando viene avviato il pacchetto. L'altra opzione che posso pensare è quella di mettere da qualche parte l'eseguibile e impostare una proprietà di sistema che punta ad esso o qualcosa del genere, ma voglio mantenere la configurazione al minimo.

Una soluzione che non è specifica per una particolare implementazione OSGi sarebbe bella, ma in caso contrario, sto usando Equinox.

Grazie!

risposta

2

La soluzione funziona, ovviamente. Ma devi stare attento anche a fermare e rimuovere qualsiasi risorsa che hai estratto e avviato durante l'installazione. Questo potrebbe essere particolarmente difficile da rintracciare nel caso in cui un eseguibile creasse anche qualche tipo di file di lavoro.

Si dovrebbe fare questo perché uno dei punti di forza di OSGi è la gestione del ciclo di vita, che consente di rimuovere anche bundle e servizi senza lasciare traccia. Per questo, il framework tiene traccia di tutto ciò che fa un bundle. Se si mantiene un'esecuzione in esecuzione dopo aver rimosso il pacchetto installato e avviato, la connessione viene persa e potrebbe continuare a essere eseguita fino al riavvio della macchina (spesso non un'opzione per i sistemi incorporati).

4

Questi file aggiuntivi devono essere scrivibili dal codice nativo? Altrimenti, non c'è nulla che ti impedisca di inserire qualsiasi file che ti piace all'interno di un pacchetto.

Il solito problema riscontrato in OSGi sta elaborando il percorso del file poiché OSGi non presuppone che sia disponibile un file system (non è così strano come sembra che OSGi sia stato avviato nei dispositivi incorporati).

Come si controlla dove il codice nativo cerca i relativi file? Hai bisogno di passare un percorso?

Se si desidera una directory per copiare o decomprimere roba, quindi utilizzare:

org.eclipse.core.runtime.Platform.getStateLocation() 

che vi dà la directory di lavoro per il pacchetto.

Se si vuole trovare il percorso per un particolare file nel pacchetto, si può fare:

org.eclipse.core.runtime.FileLocator.toFileURL((context.getBundle().getEntry("/etc/readme.txt"))) 

che, in questo caso, restituirà un URL file al /etc/readme.txt nel pacchetto corrente.

Entrambi i codici presuppongono che si trovino all'interno del metodo start() dell'attivatore.

+0

OSGi Service Platform Versione base Release 4 versione 4.3 fornisce ['BundleContext.getDataFile (String)'] (https://osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html#getDataFile% 28java.lang.String% 29), che potrebbe essere appropriato. –