2009-09-11 11 views
5

Estoy trabajando en un paquete OSGi que implementa un servicio como un contenedor alrededor de un ejecutable nativo. Es decir, el servicio ejecuta el ejecutable con ProcessBuilder, le da algunos datos y recupera el resultado. Mi pregunta es sobre la mejor forma de empaquetar este paquete. El ejecutable nativo incluye una serie de archivos de datos dependientes que deben estar presentes en el disco para que la herramienta se ejecute. He encontrado muchas referencias sobre el manejo de archivos DLL nativos en OSGi, pero ninguno que aborde los archivos asociados con un paquete que debe estar presente en el disco en lugar de solo recuperarse a través del classpath.Incluyendo recursos adicionales con paquetes OSGi

Estaba pensando que podría incluir los archivos dependientes y ejecutables directamente en el archivo del paquete y luego extraerlo programáticamente en algún directorio cuando se inicia el paquete. La otra opción en la que puedo pensar es colocar el ejecutable en algún lugar y establecer una propiedad del sistema que lo señale o algo, pero quiero mantener la configuración al mínimo.

Una solución que no es específica para una implementación de OSGi particular sería agradable, pero si no, estoy usando Equinox.

Gracias!

Respuesta

2

Su solución funciona, por supuesto. Pero también debe tener cuidado de detener y eliminar cualquier recurso que haya extraído y comenzado durante la instalación. Esto podría ser especialmente difícil de rastrear en caso de que un ejecutable también haya creado cualquier tipo de archivo de trabajo.

Debe hacer esto porque una de las fortalezas de OSGi es la gestión del ciclo de vida, que le permite también eliminar paquetes y servicios sin dejar rastro. Para esto, el marco rastrea todo lo que hace un paquete. Si mantiene una ejecución ejecutable después de eliminar el paquete que lo instaló y lo inició, la conexión se pierde y puede seguir ejecutándose hasta que se reinicie la máquina (a menudo no es una opción para sistemas integrados).

4

¿Es necesario que estos archivos adicionales se puedan escribir con el código nativo? Si no, no hay nada que te impida incluir los archivos que te gustan dentro de un paquete.

El problema habitual que tiene en OSGi es encontrar la ruta al archivo, ya que OSGi no supone que haya un sistema de archivos disponible (no es tan extraño como suena cuando OSGi comenzó en dispositivos integrados).

¿Cómo se controla el lugar donde el código nativo busca sus archivos relacionados? ¿Necesitas pasarlo por un camino?

Si quieres un directorio para copiar o desempaquetar cosas, a continuación, utilizar:

org.eclipse.core.runtime.Platform.getStateLocation() 

que le da el directorio de trabajo para el lote.

Si usted quiere encontrar la ruta de un archivo en particular en su conjunto, que puede hacer:

org.eclipse.core.runtime.FileLocator.toFileURL((context.getBundle().getEntry("/etc/readme.txt"))) 

que, en este caso, devolverá una dirección de fichero a la /etc/readme.txt en el paquete actual.

Ambos fragmentos de código suponen que están dentro del método start() del activador.

+0

OSGi Service Platform Core Especificación Versión 4 La versión 4.3 proporciona ['BundleContext.getDataFile (String)'] (https://osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html#getDataFile% 28java.lang.String% 29), que puede ser apropiado. –

Cuestiones relacionadas