2011-01-12 11 views
21

Me gustaría ser capaz de iniciar fácilmente un marco OSGi (preferiblemente Equinox) y cargar todos los paquetes enumerados en mi pom desde un Java principal.¿Iniciar programáticamente OSGi (Equinox)?

¿Esto es posible? ¿Si es así, cómo?

Parece que las herramientas pax harían esto, pero parece que no puedo encontrar ninguna documentación que indique eso. Sé que puedo poner en marcha Equinox así:

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

Pero me gustaría hacer algo más - como dije: cargar más paquetes en, tal vez empezar a algunos servicios, etc.

Respuesta

45

Cualquier marco OSGi (R4.1 o posterior) se puede iniciar mediante programación usando la 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(); 

El marco OSGi se está ejecutando. Desde Framework extiende Bundle puede llamar getBundleContext y llamar a todos los métodos de la API normales para manipular los paquetes, regístrese servicios, etc. Por ejemplo

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

Por último simplemente debe esperar a que el marco para el apagado:

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

Para reiterar, este enfoque funciona para cualquier marco OSGi incluyendo Equinox y Felix con solo poner el marco JAR en el classpath.

+0

Eso es bastante útil, gracias. Estaba luchando con la forma de iniciar y detener el marco (redirigir System.in no es tan atractivo). Mi único inconveniente en aceptar es que me gustaría poder cargar mis paquetes desde mi ruta de acceso maven sin tener que codificar un montón de rutas y otras cosas. Por otra parte, puedo estar deseando demasiado :) – javamonkey79

+0

¿Qué quieres decir con el classpath de Maven? –

+0

Realmente cualquier dependencia en mi POM: me gustaría poder detectarlas e instalarlas. – javamonkey79

2

Editar: Usted se dio cuenta quería comenzar desde dentro de java. Lástima de mí por no leer lo suficientemente cerca

Echa un vistazo a este enlace. http://www.eclipsezone.com/eclipse/forums/t93976.rhtml

Esencialmente

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(); 
} 

Editar: Maven

Parece que https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 contiene una URL controladores de servicio OSGi que puede tomar URL de los siguientes paquetes de formato y de carga de ellos (MVN: // repo/bundle_path)

+0

Ya he conseguido casi todo esto, y también he pensado en cargar desde una url http: ¿sabe cómo cargar paquetes de maven? – javamonkey79

+0

@ javamonkey79 Nunca he usado maven. Pero, https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 se ve prometedor – KitsuneYMG

+0

@KitsuneYMG: el enlace de Google está roto. ¿Tiene algún otro enlace que yo ¿puedo usar? Gracias por la ayuda .. – ferhan

5

Este hilo puede ser un poco duro, pero de todos modos ...

Pax tiene un excelente soporte para las direcciones URL de Maven, que incluso tiene un controlador de envoltura de URL que le permite convertir dinámicamente frasco no osgi a buenos paquetes ordenados.

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> 

El comando sería entonces:

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

Nota: escenario de huevo y la gallina - que tiene que instalará usando un archivo: controlador de URL primera o ponerlos en un autodeploy directorio.

Karaf tiene todo esto incorporado a su distribución, así que tal vez eche un vistazo a la fuente de launcher Karaf?

2ª nota: el despliegue de las instantáneas se permitirá añadiendo @snapshots a la URL de recompra, la configuración se gestiona a través de ConfigAdmin

En términos de la gestión de todas sus dependencias POM definido echar un vistazo a Karaf cuenta - hay un plugin que habría habilitado para generar un archivo de funciones en XML que puede ser utilizado para desplegar toda su aplicación: http://karaf.apache.org/manual/2.1.99-SNAPSHOT/developers-guide/features-maven-plugin.html

Adicionalmente este artefacto XML se puede implementar en su OBR, para que pueda tomar una vainilla configuración Felix/Equinox/Karaf, añadir el controlador de URL mvn y configurar con el repo de mvn de su empresa y luego aprovisionar toda la aplicación =)

Cuestiones relacionadas