2011-01-12 14 views
21

Mi piacerebbe essere in grado di avviare facilmente un framework OSGi (preferibilmente Equinox) e caricare tutti i bundle elencati nel mio pom da un main java.Avvia programmaticamente OSGi (Equinox)?

È possibile? Se é cosi, come?

Sembra che gli strumenti pax farebbero questo, ma non riesco a trovare alcuna documentazione che indichi tale. So di poter avviare Equinox in questo modo:

BundleContext context = EclipseStarter.startup((new String[] { "-console" }), null); 

Ma mi piacerebbe fare di più - come ho già detto: caricare più pacchi in, magari iniziare alcuni servizi, ecc

risposta

45

Qualsiasi framework OSGi (R4.1 o successivo) può essere avviato a livello di programmazione utilizzando l'API FrameworkFactory:

ServiceLoader<FrameworkFactory> ffs = ServiceLoader.load(FrameworkFactory.class); 
FrameworkFactory ff = ffs.iterator().next(); 
Map<String,Object> config = new HashMap<String,Object>(); 
// add some params to config ... 
Framework fwk = ff.newFramework(config); 
fwk.start(); 

Il framework OSGi è ora in esecuzione. Dal momento che si estende FrameworkBundle è possibile chiamare getBundleContext e chiamare tutti i normali metodi API per manipolare fasci, registrare i servizi, ecc, ad esempio

BundleContext bc = fwk.getBundleContext(); 
bc.installBundle("file:/path/to/bundle.jar"); 
bc.registerService(MyService.class.getName(), new MyServiceImpl(), null); 
// ... 

Infine si dovrebbe semplicemente attendere che il quadro di riferimento per l'arresto:

fwk.stop(); 
fwk.waitForStop(0); 

Per reiterare, questo approccio funziona per qualsiasi framework OSGi che include Equinox e Felix semplicemente posizionando il JAR del framework sul classpath.

+0

Questo è abbastanza utile, grazie. Ero alle prese con come avviare e fermare il framework (il reindirizzamento di System.in non è così allettante). Il mio unico ostacolo all'accettazione è che mi piacerebbe poter caricare i miei bundle dal mio classpath maven senza dover ricorrere a hardcode su un mucchio di percorsi e quant'altro. Poi di nuovo, potrei desiderare troppo :) – javamonkey79

+0

Cosa intendi con il classpath di Maven? –

+0

Davvero qualsiasi dipendenza nel mio POM - Mi piacerebbe essere in grado di averli rilevati e installati. – javamonkey79

2

Edit: si Realizzato volevo iniziare da dentro Java. Vergognatevi per non aver letto abbastanza da vicino

Dai un'occhiata a questo link. http://www.eclipsezone.com/eclipse/forums/t93976.rhtml

Essenzialmente

public static void main(String args[]) throws Exception { 
    String[] equinoxArgs = {"-console","1234","-noExit"}; 
    BundleContext context = EclipseStarter.startup(equinoxArgs,null); 
    Bundle bundle = context.installBundle(
    "http://www.eclipsezone.com/files/jsig/bundles/HelloWorld.jar"); 
    bundle.start(); 
} 

Edit: Maven

Sembra che https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 contiene un URL gestori servizio OSGi che può prendere URL dei seguenti formati e di carico pacchi da loro (mvn: // repo/bundle_path)

+0

Ne ho già la maggior parte e ho preso in considerazione il caricamento anche da un URL http: sapete come caricare i bundle da Maven? – javamonkey79

+0

@ javamonkey79 Non ho mai usato Maven. Tuttavia, https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 sembra promettente – KitsuneYMG

+0

@KitsuneYMG: il link di Google è rotto .. Hai qualche altro link che io poter usare? Grazie per l'aiuto .. – ferhan

5

Questo thread potrebbe essere un po 'stantio, ma in ogni caso ...

Pax ha un eccellente supporto per gli url Maven, che ha anche un gestore di involucro URL che consente di convertire dinamicamente vaso non OSGi per piacevoli fasci ordinati.

http://wiki.ops4j.org/display/paxurl/Mvn+Protocol

<dependency> 
     <groupId>org.ops4j.pax.url</groupId> 
     <artifactId>pax-url-wrap</artifactId> 
     <version>1.2.5</version>   
    </dependency> 
    <dependency> 
     <groupId>org.ops4j.pax.url</groupId> 
     <artifactId>pax-url-mvn</artifactId> 
     <version>1.2.5</version>   
    </dependency> 

Il comando sarebbe allora:

install -s mvn:groupId:artifactId:version:classifier 

Nota: scenario di pollo uovo - è necessario installare questi utilizzando un file: gestore url prima o metterli in un autodeploy directory.

Karaf ha tutto questo nella sua distribuzione, quindi forse date un'occhiata alla fonte di avvio di Karaf?

2 ° nota: la distribuzione istantanee vengono abilitare aggiungendo @snapshots all'URL pronti contro termine, la configurazione è gestito tramite ConfigAdmin

In termini di gestione di tutte le POM definito dipendenze di dare un'occhiata a Karaf dispone - c'è un plugin che sarebbe consentire di generare un file di funzionalità XML, che possono poi essere utilizzati per distribuire l'intera applicazione: http://karaf.apache.org/manual/2.1.99-SNAPSHOT/developers-guide/features-maven-plugin.html

ulteriormente più questo artefatto XML può essere distribuito al vostro OBR, in modo da poter prendere una vaniglia configurazione Felix/Equinox/Karaf, aggiungi il gestore di mvn url e configura con il repository mvn della tua azienda, quindi fornisci l'intera app =)