2012-03-12 18 views
9

Desarrollo una aplicación Eclipse RCP que hace un uso intensivo de paquetes OSGi que proporcionan servicios para su uso posterior. El caso de uso requiere que los paquetes registren sus servicios (por ejemplo, filtros de importación) para usarlos más adelante en diferentes situaciones. Los paquetes OSGi están compilados con maven-bundle-plugin.Cómo inicio automático/inicio ansioso Servicios OSGi en plataforma Eclipse

¿Cómo puedo decirle a Equinox que inicie los paquetes de OSGi automáticamente? El enfoque normal a través del activador no está funcionando. Solo el modo perezoso funciona, pero no puedo tocar las clases dentro de paquetes desconocidos. Leí la especificación OSGi y no se proporciona lo contrario a la carga lenta, carga ansiosa. ¿Hay otra oportunidad de marcar el paquete para una carga automática?

Dentro de Eclipse tengo la oportunidad de establecer el inicio automático en verdadero, pero ¿qué debo hacer en una distribución construida por Maven y Tycho?

Los servicios declarativos no funcionan debido a la publicación de un org.eclipse.equinox.ds no cargado. ¿Puedo comenzar de alguna manera en lugar de un Activador? Esta también sería una solución, pero no sé cómo crear la distribución o qué configurar como configuración.

¿Cuáles son las mejores prácticas aquí? existen algunas otras posibilidades? La documentación sobre los paquetes OSGi en la plataforma Eclipse es un poco delgada.

+1

No sé acerca de maven/tycho. Pero si usa la secuencia de comandos pde ant, usa 'config.ini' para controlar el inicio automático. Verifique 'config.ini' generado bajo' workspace \ .metadata \ .plugins \ org.eclipse.pde.core \ your-rcp-product-name.product'. –

+1

ver http://software.2206966.n2.nabble.com/tycho-generated-config-ini-does-not-start-runtime-td6077893.html –

Respuesta

4

Estaba en el camino correcto con servicios declarativos. El registro manual de sus servicios se parece mucho al trabajo arduo, y buscarlos de forma segura puede ser aún más trabajo y complicado de hacer bien. Otro estándar en esta área que hay que tener en cuenta es Blueprint, aunque ciertamente no sugiero que reescribas nada si tienes metadatos de DS en su lugar. Blueprint tiene características ligeramente mejores en un entorno muy dinámico y una configuración más rica. (Soy un committer en una de las implementaciones de Blueprint, Apache Aries). Con Blueprint y DS, lo importante es que otra cosa es administrar sus servicios por usted.

Esto nos deja con la cuestión de por qué sus paquetes no se están iniciando. Creo que debe haber una pista en el hecho de que comienzan en Félix. ¿Has encendido una consola Equinox y confirmado que todos tus paquetes están instalados y resueltos? ('ss' para listar paquetes.) ¿Ha echado un vistazo al archivo config.ini y ha confirmado que sus paquetes están en la lista, y con un nivel de inicio apropiado, o está utilizando el paquete Equinox auto-start-everything else?

+0

Sí, probaré los servicios declarativos a continuación. Lo diré más tarde. –

+0

Entonces, estaba funcionando. Dejo que el DS se inicie durante el tiempo de ejecución y dejo que declaren los servicios a través de XML. Los servicios anteriores se resolvieron y no se iniciaron. Cómo puedo influir en eso, no sé. Pero DS está trabajando. –

0

MANIFIEST.MF tiene esta:

Bundle-ActivationPolicy: lazy 

Esto podría ser útil también:

http://wiki.eclipse.org/Lazy_Start_Bundles#Should_I_change_to_the_new_Bundle-ActivationPolicy_Header.3F

Sin embargo yo diría que me gustaría tratar de depender de la activación OSGi tanto como sea posible. Si no hay otra manera de resolver su problema, entonces el enlace anterior podría ayudar.

+2

Para la carga lenta, mi aplicación necesita saber sobre los paquetes que se van a activar . Esto no es deseado y no es un buen diseño. Es por eso que eliminé la carga lenta. En Felix mis paquetes están activados correctamente. Solo Equinox causa algunos problemas. Lo que necesitaría es 'Bundle-ActivationPolicy: auto', pero esto no es compatible. –

5

Puede usar el punto de extensión "org.eclipse.ui.startup" en su complemento. Esto le permite especificar una clase IStartup a la que se llamará cuando se inicie la UI de Eclipse. Siempre que esta sea una clase en su paquete, se iniciará su paquete.

Significará incluir un archivo plugin.xml, y esto sería específicamente un complemento Eclipse en lugar de un paquete OSGi estándar, pero podría utilizar este complemento para activar cualquiera de sus paquetes OSGi estándar.

+0

Algunos de los paquetes que uso son bastante genéricos y no quiero hacerlos para eclipsar complementos. Lo sé, no es un problema agrupar un plugin.xml y otros archivos en el contenedor, pero creo que no está realmente limpio. Su sugerencia es buena y creo que funcionará, pero creo que es mi última opción. ¡Gracias de cualquier manera! –

+0

No creo que haya necesidad de modificar sus paquetes actuales. El plugin de Eclipse podría ser simplemente un nuevo paquete con el único trabajo de garantizar que el paquete de DS haya comenzado, de esa manera se encontrarán todos sus servicios declarativos. Esto evita tener que especificar paquetes de inicio en el archivo config.ini. –

8

suspiro. Eres víctima de una estrategia equivocada en Eclipse para evitar que los programadores (tontos) amplíen el tiempo de inicio. En lugar de advertir, simplemente decidieron no iniciar los paquetes en absoluto.Esto es lo opuesto a lo que OSGi recomienda :-(Un paquete solo puede activarse (básicamente anula el inicio) cuando alguien carga una clase (esto es lo que es la activación lenta)

La mejor solución es use los servicios declarativos. Puede declarar servicios inmediatos, que se activarán al inicio, y puede declarar servicios perezosos, que se activan cuando se usan. Los perezosos son por supuesto preferidos (cuando no es un programador tonto) pero ciertos casos de uso requerir inmediata, como ejemplo, un servidor que ofrece sus servicios en internet usted tiene que asegurarse en sus config.ini que se ha iniciado DS

+0

Sí, ya leí sobre las diferentes filosofías. Me gusta y soporto la carga diferida, pero como mencionaste: algunos diseños necesitan una carga automática para registrar servicios (patrón de pizarra). Probaré los servicios declarativos. –

+0

Como ha dicho, Eclipse normalmente no iniciará ningún paquete a menos que se indique explícitamente en la configuración o utilice la activación diferida y tenga una clase cargada por otro paquete. Este es un problema para DS ya que los paquetes detenidos/instalados se ignoran. Sin embargo, sí noté que Equinox Service Component Runtime tiene una función oculta: si declara su paquete como de carga lenta y su componente está marcado como "inmediato", el SCR comenzará su paquete * para * usted (probablemente porque SCR cifras que si nadie lo comenzó, nadie más lo hará). Todavía no tengo idea sobre el comportamiento no inmediato. – JBert

0

puede agregar esto a su .product archivo:..

<configurations> 
    <plugin id="my.plugin.id" autoStart="true" startLevel="4" /> 
</configurations> 

Como alternativa, abra el archivo .product en Eclipse y vaya a la pestaña Configuración, y agregue allí el complemento con el nivel de inicio deseado.

Cuestiones relacionadas