java - ¿Iniciar programáticamente OSGi(Equinox)?
maven pax (3)
Me gustaría poder iniciar fácilmente un marco OSGi (preferiblemente Equinox) y cargar todos los paquetes enumerados en mi pom desde un Java principal.
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 lo indique. Sé que puedo iniciar Equinox de la siguiente manera:
BundleContext context = EclipseStarter.startup( ( new String[] { "-console" } ), null );
Pero me gustaría hacer más, como dije: cargue más paquetes, quizás inicie algunos servicios, etc.
Cualquier marco OSGi (R4.1 o posterior) puede iniciarse mediante programación utilizando la API de 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 ahora se está ejecutando. Dado que Framework
extiende Bundle
, puede llamar a getBundleContext
y llamar a todos los métodos API normales para manipular paquetes, registrar servicios, etc. Por ejemplo
BundleContext bc = fwk.getBundleContext();
bc.installBundle("file:/path/to/bundle.jar");
bc.registerService(MyService.class.getName(), new MyServiceImpl(), null);
// ...
Finalmente, debe esperar a que se cierre el marco:
fwk.stop();
fwk.waitForStop(0);
Para reiterar, este enfoque funciona para cualquier marco OSGi, incluidos Equinox y Felix con solo poner el marco JAR en el classpath.
Editar: se dio cuenta de que quería comenzar desde adentro de java. Lástima de mí por no leer lo suficientemente cerca
Mira 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 un servicio OSGi URl Handlers que puede tomar URLs del siguiente formato y cargar paquetes de ellos ( mvn: // repo / bundle_path)
Este hilo puede ser un poco rancio, pero de todos modos ...
Pax tiene un excelente soporte para urls maven, incluso tiene un manejador de URL envolvente que le permite convertir dinámicamente el bote que no es de osgi en paquetes bonitos y 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 de gallina: debes instalarlo usando un archivo: manejador de url primero o ponlos en un directorio de autodespliegue.
Karaf tiene toda esta compilación en su distribución, así que tal vez eche un vistazo a la fuente del lanzador de Karaf.
Nota 2: la implementación de instantáneas se habilita al agregar @snapshots a la URL del repositorio, la configuración se administra a través de ConfigAdmin
En términos de administración de todas sus dependencias definidas de POM, eche un vistazo a las características de Karaf; hay un complemento que le permitiría generar un archivo XML de características que luego se puede usar para implementar toda su aplicación: http://karaf.apache.org/manual/2.1.99-SNAPSHOT/developers-guide/features-maven-plugin.html
Además, este artefacto XML se puede implementar en su OBR, por lo que puede tomar una configuración vainilla de Felix / Equinox / Karaf, agregar el controlador de URL mvn y configurar con el repositorio mvn de su empresa y luego aprovisionar toda la aplicación =)