Sto usando OSGi per il mio ultimo progetto al lavoro, ed è piuttosto bello per quanto riguarda la modularità e la funzionalità.Che cos'è un flusso di lavoro di sviluppo OSGi ragionevole?
Ma non sono soddisfatto del flusso di lavoro di sviluppo. Alla fine, ho in programma di avere 30-50 bundle separati, disposti in un grafico delle dipendenze - presumibilmente, questo è ciò per cui OSGi è progettato. Ma non riesco a capire un modo pulito per gestire le dipendenze al tempo compilare.
Esempio: i pacchetti A e B. B dipendono dai pacchetti definiti in A. Ciascun pacchetto viene sviluppato come progetto Java separato.
Per compilare B, A deve essere nel percorso di classe javac.
- di riferimento la posizione del file system del progetto A in script di build di B:
fare?
- Costruisci A e getta il contenitore nella directory lib di B?
- Affidatevi alla funzione "progetti di riferimento" di Eclipse e utilizzate sempre il classpath di Eclipse per compilare (ugh)
- Utilizzare una directory di "lib" comune per tutti i progetti e scaricare i contenitori di bundle lì dopo la compilazione?
- Configurare un repository di bundle, analizzare il manifest dallo script di build e tirare giù i bundle richiesti dal repository?
No. 5 suona il più pulito, ma anche come un sacco di spese generali.
Le dipendenze binarie sono cose pericolose da consigliare. Ho aiutato un cliente la scorsa settimana a eseguire il debug di un problema con il caricatore di classi causato dall'avere 2 copie dello stesso barattolo binario in 2 bundle diversi. Quando hanno tentato di passare istanze di oggetti dal jar binario da un bundle all'altro erano presenti un'eccezione cast di classe. È molto meglio usare le istruzioni del pacchetto di importazione/esportazione come previsto. Nel caso del cliente, la soluzione consisteva nel creare un pacchetto dal barattolo binario che ha esportato i pacchetti richiesti. Quindi entrambi i pacchetti clienti hanno importato i pacchetti necessari dal nuovo pacchetto. –
Hm. Speravo di evitare di rendere Mavenizing l'intero progetto, ma potrei non riuscire ad evitarlo. – levand
Hai un seguito da questa domanda, come l'hai gestita? Ho un problema molto simile che ho risolto reinventando la ruota Maven. Ci sono voluti molti sforzi per evitare l'utilizzo di Maven, quindi alla fine ho trovato una soluzione che era un sottoinsieme di Maven che alla fine dovrò convertire a Maven. Più le dipendenze del progetto diventano complesse, maggiori sono i benefici che Maven offre a ciò che proviene da qualcuno che non gradisce la complessità di esso). – Chris