2010-06-10 10 views
5

Ho un progetto che fa riferimento a un numero di librerie open source, alcune nuove, altre non così nuove. Detto questo, sono tutti stabili e desidero attenermi alle versioni scelte finché non avrò il tempo di migrare alle versioni più recenti (ho testato ieri hsqldb 2.0 e contiene molte modifiche API).Qual è il metodo standard per raggruppare le librerie dipendenti da OSGi?

Una delle librerie che ho voluto incorporare è Jasper Reports, ma come tutti voi sicuramente sapete, viene fornito con una montagna di file jar di supporto e ho solo bisogno di un sottoinsieme della montagna (noto) quindi sto pianificando per il pacchetto personalizzato di tutte le mie librerie dipendenti.

Quindi:

  • Ha tutti abitudine-faccia i propri fasci OSGi per librerie open-source che stanno utilizzando o c'è una fonte maestro di versioni OSGi di librerie comuni?

  • Inoltre, stavo pensando che sarebbe molto più semplice per ciascuno dei miei pacchetti semplicemente incorporare i propri barattoli dipendenti all'interno del pacchetto stesso. È possibile? Se scelgo di incorporare le librerie di focalizzazione di terze parti all'interno di un pacchetto, presumo che avrò bisogno di produrre 2 file jar, uno senza le librerie incorporate (per le librerie da caricare tramite classpath tramite il classloader standard) e una versione di osgi che include la libreria incorporata, quindi dovrei scegliere un nome di bundle come questo < <myprojectname> > - < <sottoprogetto> > -osgi-.1.0.0.jar?

  • Se non riesco ad incorporare le librerie open source e scelgo di raggruppare in modo personalizzato le librerie open source (tramite bnd), dovrei scegliere un nome bundle univoco per evitare conflitti con un possibile bundle ufficiale? per esempio. < <MyProjectName> >-< <3rdpartylibname> >-< <3rdpartylibversion> > .jar?

  • Il mio progetto non abilitato a OSGi attualmente esegue la scansione di plug-in personalizzati tramite la scansione delle cartelle META-INF nei miei vari jar di plugin tramite Service.providers (...). Se vado OSGi, funzionerà ancora questo meccanismo?

risposta

7

Preferisco non incorporare i vasi dipendenti (sì è possibile). Causa due problemi,

1) Non è possibile riutilizzare questo codice. Molti pacchetti possono semplicemente fare la stessa cosa (incorporare lo stesso barattolo) e si finisce con lo stesso barattolo installato molte volte. Puoi sostenere che il tuo bundle può esportare le interfacce anche per il jar incorporato, ma questo diventa brutto in quanto non dovrebbe essere la responsabilità del bundle esporre quel codice. Inoltre, rende più semplice l'esposizione di più versioni della libreria o più provider della stessa versione.

2) Questo è specifico di Eclipse - I jar incorporati non vengono risolti correttamente nell'ambiente di sviluppo (funziona ancora in fase di esecuzione). Il mio bundle potrebbe dipendere da un bundle nella mia piattaforma di destinazione e non riuscirà a risolvere gli elementi nei jar incorporati, per cui devono essere importati nello spazio di lavoro.

Ho scoperto che la maggior parte dei barattoli open source è già stata gentilmente offerta bundled by the nice folks at Spring. Ci sono anche altri repository disponibili, ma sfortunatamente ho perso i miei link.

+2

I vasi Spring hanno stampato Spring dappertutto e sembrano essere versioni precedenti di librerie (come la versione 2.0.5 di Jasper Reports). OSGi sembra bello in teoria, ma sembra che ognuno stia costruendo i propri pacchetti (compresa la primavera) che sconfigge lo scopo. Per non parlare del problema JDBC con OSGi. L'inferno DLL è stato risolto con il classpath. L'inferno del Classpath è stato risolto con OSGi. Cosa ci salverà dall'inferno di OSGi? – Chris

+1

@Chris: è abbastanza vero sulla denominazione, ma poiché non esiste alcuna autorità centrale per fornire i pacchetti e non vengono creati dal proprietario, sembra un ragionevole compromesso. Almeno sapete da dove viene, e non fa differenza una volta schierato. Per quanto riguarda la sua utilità, è solo un altro strumento nella cintura, abbastanza utile per la costruzione di sistemi di tipo collegabile. – Robin

+0

L'idea di utilizzare spring repo come sorgente per i plugin esterni di rcp è ottima, ma dove posso trovare l'URL del sito di aggiornamento/ripristino che ho bisogno di aggiungere alla mia definizione di destinazione. Ho provato a google ma non sono riuscito a trovare un url funzionante. So che aggiungere l'url alla risposta sarà presto superato. Ma sarebbe sicuramente di aiuto e forse altri lo aggiorneranno in futuro ... – Jens

2

progetto Orbit The Eclipse ha anche fatto fasci di molti vasi di terze parti comunemente usati.

http://www.eclipse.org/orbit/

+0

Grazie per il link. Sfortunatamente, la mia domanda rimane comunque. – Chris

1

per essere precisi circa le domande che hai chiesto.

Ognuno non fa il suo. Vedere la mia risposta precedente per un collegamento al pacchetto Eclipse di librerie di terze parti come pacchetti. Se non riesci a trovare la versione già confezionata, dovrai crearne una tua.

È meglio racchiudere le dipendenze binarie nel proprio bundle piuttosto che includere il jar come binario nel pacchetto di codice. Scegli il nome del pacchetto che desideri, le importazioni e le esportazioni del pacchetto che contano. Namespacing il nome del bundle con il nome del progetto assicurerà di non colpire collisioni.

Ottenere l'accesso alla zona di stoccaggio pacchetto per la scansione non è impossibile, ma tende a richiedere OSGi runtime informazioni specifiche su come/dove i fasci vengono estratti. Quindi è possibile, ma non facile.

+0

Via OSGi, come faccio a sapere quali plugin sono disponibili tramite bundle non installati? Di solito analizzo il classpath per un file che ho inserito nel META-INF al momento. Sembra che OSGi sia incompatibile con qualsiasi cosa che attualmente utilizza il classpath per la modularità. "Il mio progetto attivato non OSGi attualmente scansioni per plugin personalizzati tramite la scansione delle cartelle META-INF nei miei vari vasetti plugin tramite Service.providers (...). Se vado OSGi, sarà questo meccanismo continuerà a funzionare?" – Chris

0

usiamo Maven con OSGI, dichiariamo le dipendenze del bundle nel suo pom.xml e non devi più preoccuparti di esse.

+1

Non è del tutto vero, però.È necessario ottenere o creare i bundle da soli (non tutto è in bundle), è necessario consentire l'implementazione dei bundle e gestire il controllo delle versioni corretto (non è possibile semplicemente sostituire un pacchetto con una versione superiore, i bundle potrebbero richiedere la versione precedente)) e così via. Ciò è particolarmente importante se la distribuzione viene gestita da una divisione diversa all'interno dell'azienda, ad esempio gli amministratori di sistema. – extraneon