2012-09-24 13 views
8

Ho creato un'applicazione Eclipse 4 e avevo bisogno di un jar che offrisse una funzionalità come parte della mia applicazione (questo potrebbe essere qualsiasi cosa ad esempio log4j per renderlo banale).
Ho aggiunto il jar come parte del classpath del mio progetto (Right Click->Configure Build Path) ma durante il runtime il mio servizio non è riuscito con un errore ClassNotFound (da OSGI, suppongo?).
Ad ogni modo cercando questo risulta, almeno come ho capito, che dovrei aggiungere il barattolo come parte di un altro Plugin e creare una dipendenza dalla mia applicazione/servizio a questo nuovo plugin.
I.e. Ho creato un Plugin Project from Existing JAR archives.
Questa volta l'installazione ha funzionato.
Quindi, se capisco questo, quando si sviluppa per Eclipse/OSGi non si dovrebbe aggiungere direttamente jars nei classpath ma aggiungerli tramite plugin (perché?).
Domanda: Se sono corretto finora, qual è la pratica standard per includere jars durante lo sviluppo di un progetto?
Definire/Creare un Plugin Project from existing JAR archives e aggiungere tutti le librerie di terze parti richiesti necessari lì, o avere un diverso progetto di plug-in per necessità jaro qualcos'altro forse ???
Ci scusiamo se la mia terminologia non è accurata. Sono nuovo nella programmazione OSGi ed EclipseCome includere una dipendenza in un file jar da un'applicazione eclipse/osgi?

Nota: Quando si parla di jars Non mi riferisco ad altri servizi OSGi. Mi riferisco alla norma sull'uso di librerie di terze parti pronte e affidabili che sarebbero necessarie in molte parti di un'applicazione. Per esempio. log4j o una libreria di analisi xml o apache commons ecc.

+0

Qual è il tuo obiettivo finale: Vuoi creare un risultato finale per il "vostro" del progetto, dicono un jar/zip che ha tutte le classi/vasetti/risorse necessari per eseguire il programma? – Kashyap

+0

@thekashyap: Non sono sicuro di aver capito la tua domanda.Il prodotto esportato è predefinito dalla configurazione '.product', giusto? Quindi la mia preoccupazione è come deve essere configurato il progetto in modo che nella distribuzione so che tutti i vasi necessari sono disponibili . – Cratylus

+0

Check out: http://www.vogella.com/articles/OSGi/article.html e http://www.coderanch.com/t/104274/vc/Order-Export-tab-Java-Build – Kashyap

risposta

3

Gli esempi che hai citato sono disponibili come bundle OSGi, quindi non è necessario renderli bundle da soli. Solitamente non si utilizzano le dipendenze dirette di jar in OSGi, in genere si utilizzano dipendenze di pacchetti o bundle. Nell'esempio di log4j a cui si fa riferimento, è necessario utilizzare il pacchetto di importazione in quanto possono essere presenti più provider di bundle (jar log4j più recente, versione bundle di sorgenti di log4j precedenti, implementazione di slf4j ...). Questo disconnetterà le dipendenze del codice dal fornitore effettivo.

Queste dipendenze vengono mantenute tramite manifest, non il classpath del progetto. In un progetto plug-in di eclipse, il percorso di generazione dei progetti generato deriva dalle voci nel manifest.

Anche se non si utilizzano i servizi, tutte le dipendenze del codice vengono comunque mantenute tramite manifest.

+0

Ma se uso il pacchetto "import" significa che il 'jar' è da qualche parte nel contenitore' OSGi' sulla distribuzione giusto? Allora come faccio a sapere quali vasi sono già disponibili? come faccio a sapere che 'log4j' è già offerto? E come dovrei usare "apache commons"? È già incluso? Come è possibile? – Cratylus

+0

Intendo anche che ci sono casi in cui avrei bisogno di alcuni jar non già offerti come bundle, giusto? – Cratylus

+0

La distribuzione di pacchetti per un'applicazione è specifica dell'implementazione. In Eclipse, la piattaforma di destinazione determina quali bundle sono disponibili. Per quanto riguarda i jar non raggruppati, puoi semplicemente creare pacchetti per loro con eclipse creando un nuovo progetto plugin dal jar esistente. Puoi anche includerlo all'interno del pacchetto, ma preferisco l'approccio bundle. – Robin

5

Per il runtime è sempre il manifest e le intestazioni che controllano ciò che è nel classpath del pacchetto. Esistono tre modi per accedere a un jar:

  1. Intestazione del pacchetto di importazione. Questo è il modo consigliato. Si definisce un'importazione per pacchetto che è necessario. Il vaso che desideri accedere deve essere distribuito nel runtime come pacchetto. Ha anche bisogno di esportare tutti i pacchetti necessari.

  2. Require-Bundle. Questo è un altro modo per accedere ai pacchetti. Definisci l'id del pacchetto che ti serve e vedi tutti i pacchetti che esporta. Poiché Require-Bundle ti lega più strettamente all'altro pacchetto, il modo Import-Package dovrebbe essere preferito.

  3. Percorso classe. Ciò consente di aggiungere dei jar al classpath che si incorpora nel proprio bundle. Questo dovrebbe essere l'ultima risorsa solo quando l'altro modo non funziona. Puoi avere problemi di caricamento di classe quando li mescoli con gli altri metodi.

È possibile trovare molti pacchetti prefabbricati in Maven centrale. Oggi molti vasi contengono già un manifest OSGi. Per i casi in cui questo non è vero, molti jar vengono riconfezionati come pacchetti da servicemix. Vedi groupId: org.apache.servicemix.bundles. C'è anche il repository del bundle di primavera dove ne trovi altri.

Qui di seguito ho elencato alcune risorse si potrebbe desiderare di leggere:

http://www.aqute.biz/Blog/2007-02-19

http://wiki.osgi.org/wiki/Import-Package

http://wiki.osgi.org/wiki/Require-Bundle

http://www.vogella.com/blog/2009/03/27/required-bundle-import-package/

+0

Per caso (1) se ho bisogno di creare un bundle per i jar necessari, dovrei mettere * tutti * i jar necessari in questo pacchetto (nel caso ne avessi bisogno più di uno) ** o ** ogni jar dovrebbe essere in ogni bundle? – Cratylus

+0

Penso che il modo migliore per creare pacchetti da jar sia semplicemente aggiungere le voci manifest. Quindi ogni barattolo sarà il proprio pacchetto. Ciò ha il vantaggio che la struttura di depdendency di Maven corrisponde ai bundle. Btw. se devi creare dei pacchetti dai un'occhiata a bnd e al plugin del bundle di maven. –

3

Extactaly stesso problema che abbiamo dovuto affrontare nel nostro progetto. abbiamo alcuni jar legacy che non sono compatibili con OSGi, creiamo la cartella lib parallelamente a BundleContent e la aggiungiamo nella sezione classpath di manifest.

Bundle-ClassPath: ., 

/lib/<legacy jar>.jar 

Non v'è alcuna necessità di esportazione e l'importazione di pacchetti inutilmente se solo un fascio sta per consumare,

+2

+1 Questo pacchetto aggiunge un overhead insopportabile, in particolare quando si sviluppano in parallelo JAR e il plugin Eclipse. Fastidioso, e ad ogni iterazione, consuma tempo, prende il via dal flusso ... I ** odia vigorosamente Eclipse ** per evitare Maven dal processo di sviluppo dei plugin. Sì, c'è Tycho, ma preferirei schiaffeggiare la mia stessa testa con il braccio appena tagliato Mi sono appena morso dalla spalla fino a quando non mi sento a mio agio di usare quel criptico e non documentato aiuto per la banda progettato per la ferita settica spalancata che è l'eredità del plugin Eclipse Uso della dipendenza JAR. Agile, NON! – ppeterka

Problemi correlati