2012-11-22 10 views

risposta

13

In fase di esecuzione nel contenitore OSGi non fa nulla. In realtà, non è nemmeno menzionato nelle specifiche OSGi (ho controllato R4).

Tuttavia, può essere specificato in un file .bnd da utilizzare da bnd al momento della compilazione. Se è così, può essere usato per determinare cosa entra nel pacchetto. Quando bnd crea un pacchetto, determina automaticamente quali classi devono essere inserite nel pacchetto. Sono incluse tutte le classi nei pacchetti esportati e sono incluse anche tutte le classi da cui dipendono (in modo transitorio). Ciò significa che se una classe non sembra essere utilizzata, allora non sarà inclusa nel pacchetto. Tuttavia, puoi usare l'istruzione Private-Package per dire a bnd di includere il contenuto del pacchetto nel pacchetto, anche se sembra non essere utilizzato. Se l'istruzione del pacchetto privato non è specificata, verrà generata automaticamente da bnd.

La documentazione per Private-Package recita:

pacchetto privato

Il metodo di inserimento è identica a quella di intestazione Export-Package, l'unica differenza è, è che questi pacchetti non sono esportato. Questa intestazione verrà copiata sul manifest. Se un pacchetto è selezionato da noth le intestazioni del pacchetto di esportazione e private, allora l'esportazione ha la precedenza.

privato-Package = com. *

3

Infatti privato-Package non si limita a non esportare un pacchetto. Se i pacchetti specificati in Pacchetto privato non sono definiti all'interno del proprio progetto e non sono importati in Importa-Pacchetto, vengono automaticamente inseriti nel contenitore. Quindi questo è un modo semplice per includere dipendenze non OSGi. Fai attenzione però che l'inlining può facilmente portare a problemi di classpath.

11

Se si conosce il collegamento statico , è possibile comprendere il pacchetto privato. Altrimenti, continua a leggere.

Private-Package è il modo di dirvi i pacchetti che devono trovarsi all'interno del contenitore ma che non vengono esportati. È non un header OSGi ma una "istruzione" bnd.

L'istruzione definisce i pacchetti dal classpath (con caratteri jolly) che devono essere inclusi nel JAR. bnd è univoco che popola il JAR da una specifica e non da una directory come la maggior parte degli strumenti di compilazione. Il motivo è che, a meno che i moduli non siano "progettati" e il loro layout attentamente considerato, raramente offrono vantaggi modulari.

In generale, Private-Package specifica i pacchetti contenenti le classi che non devono essere condivise con altri bundle, ovvero le classi di implementazione. Sebbene in generale provengano dal progetto corrispondente che viene utilizzato in esso, è perfettamente accettabile ottenerli da qualsiasi altro JAR sul classpath.

Un caso d'uso è una libreria con programmi di utilità. Girare una libreria di util in un bundle di solito causa il caos con le dipendenze poiché gli util tendono a dipendere da molte cose non correlate; usi un piccolo metodo e improvvisamente trascini 30Mb di dipendenze. bnd stesso usa pesantemente questo modello con i pacchetti aQute.lib *, i pacchetti da questa libreria non dovrebbero mai essere esportati. È uno scambio tra le dimensioni del pacchetto e il "download di Internet".La differenza è visibile tra i mondi di Eclipse e Apache Felix. I bundle Apache Felix sono solitamente standalone e non richiedono tutti i tipi di supporto e bundle utili mentre i bundle di Eclipse hanno la tendenza a richiedere molti bundle idraulici. Penso che questa differenza sia in gran parte causata dalla PDE di Eclipse che rende impossibile includere pacchetti da altri progetti a meno che non si copi il codice sorgente che ovviamente è un grande no-no.

Nel mondo C hanno qualcosa chiamato collegamento statico. Dopo che un programma è stato collegato, tutti gli elementi irrisolti vengono recuperati da una libreria e aggiunti alla destinazione. In un certo senso Private-Package è la stessa idea. In realtà c'è un header Conditional-Package che collega staticamente i pacchetti specificati e qualsiasi cosa da cui dipendono transitivamente (a patto che cadano nel pattern).

Alla fine bnd mostra i pacchetti espansi che non vengono esportati nell'intestazione del pacchetto privato nel file manifest. Dopo tutto, un manifesto dovrebbe descrivere i contenuti ...

Se sei l'autore è possibile rimuovere l'intestazione con -removeheaders: Private-Package (o in maven con < _removeheaders> Private-pacchetto

+0

posso chiedere perché BND non "pacchetto privato" tutte le classi non esportate? Se hai una classe nel tuo progetto è perché ne hai bisogno, quindi se non è esportato, non dovrebbe essere privato. parole, quando non esporti -Pacchetto o privato -Pacchetti un pacchetto? – Hilikus

+1

Devi designare i pacchetti privati ​​perché bnd non assume che tutte le classi dalla directory src debbano essere incluse, quindi non c'è un ambito che permetta la sottrazione di esportato pacchetti. Qualsiasi pacchetto sul percorso di classe di bnd può essere incluso in un pacchetto, o pr ivato o esportato. In questo modo, bnd può creare più bundle da un singolo progetto, diversamente dalla maggior parte degli ambienti di costruzione. Permette anche l'esportazione di pacchetti API forniti dal bundle, anche se provengono da un altro bundle/jar. –