Un fragmento OSGi es un archivo de archivador Java™ con cabeceras de manifiesto específico que lo habilita para conectarse a un paquete o paquetes de sistema principal especificado para la función principal. Los fragmentos se tratan como parte de los paquetes de sistema principal. Las definiciones relevantes de los fragmentos se fusionan con las definiciones de paquetes del sistema principal antes de que se resuelva el sistema principal, proporcionando la información que no está en conflicto. Las dependencias de fragmentos se resuelven si es posible. Si las dependencias de fragmentos no se pueden resolver, el fragmento no se puede conectar al paquete del sistema principal. Un fragmento no puede tener su propio cargador de clases ni un activador de paquetes. No se puede alterar temporalmente la información presente en los paquetes del sistema principal. Los fragmentos amplían los paquetes con los recursos, clases y cabeceras permitidas, que le permiten personalizar los paquetes.
Archivos de manifiesto de fragmentos OSGi
Un archivo JAR de fragmentos OSGi contiene un archivo de manifiesto de fragmentos. Este archivo contiene los metadatos que permiten que la infraestructura OSGi se conecte al fragmento de un paquete o paquetes de un sistema principal.
El código siguiente es un ejemplo del contenido de un archivo de manifiesto de paquetes,
META-INF/MANIFEST.MF:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Fragment
Bundle-SymbolicName: Fragment
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Fragment-Host: WebBundle;bundle-version=1.0.0.qualifier
Import-Package: org.apache.commons.logging;version="1.0.4"
Export-Package: com.sample.myservice.api;version="1.0.0"
Los metadatos de este archivo de manifiesto incluyen las siguientes propiedades clave:
- Fragment-Host
- Enlaza el fragmento a los sistemas principales de paquetes potenciales.
- Bundle-Version
- Describe la versión del fragmento y permite que haya varias versiones de un paquete activas simultáneamente en la misma instancia de la infraestructura.
- Bundle-Name
- Proporciona un nombre legible del fragmento.
- Bundle-SymbolicName
- Identifica el fragmento en la infraestructura de forma única. No sustituye la necesidad de una cabecera Bundle-Name.
- Import-Package
- Declare las dependencias externas del fragmento que utiliza el marco de trabajo OSGi para la resolución de fragmentos. Se pueden
declarar versiones específicas o rangos de versiones para cada paquete. En este archivo de manifiesto de ejemplo, el paquete org.apache.commons.logging es necesario en la versión 1.0.4 o posterior.
- Utilice esta propiedad para especificar los nombres de los paquetes en el que desea importar su fragmento en el tiempo de ejecución. Si no especifica el paquete necesario en esta propiedad, puede obtener una excepción NoClassDefFound y un error de compilación cuando se carga el paquete.
Nota: También debe especificar este paquete en la propiedad Paquete de exportación (Export-Package) del paquete compuesto que contiene el paquete.
Restricción: Si el archivo de manifiesto de paquete utiliza la
propiedad Import-Package para declarar una dependencia de paquete para un
paquete que no está en el espacio de trabajo o la plataforma de destino, el editor marca la
dependencia como un error. Para solucionar esta limitación, asegúrese de que todos los paquetes que
declara como dependencia están en el espacio de trabajo o utilice el arreglo rápido
para añadir el paquete a la plataforma de destino. Para utilizar el arreglo rápido, cambie
a la vista de marcadores y, a continuación, pulse el botón derecho del ratón en el marcador de error
y seleccione Arreglo rápido.
Importante: Cuando especifique
dependencias de paquete en el archivo
MANIFEST.MF, utilice la
propiedad
Import-Package en lugar de
Require-bundle. Si
utiliza
Require-bundle para especificar dependencias de paquete,
la aplicación no se despliega.
Import-Package es una forma más
flexible de declarar dependencias:
- Puede declarar dependencias en la funcionalidad que necesita
en lugar de hacerlo en el paquete donde se originó la funcionalidad, ya que
no añade dependencias innecesarias en paquetes que no son necesarios
para el paquete pero que se incluyen en el paquete dependiente.
- Puede especificar versiones o rangos de versiones para el paquete declarado,
por lo tanto no tiene que reaccionar ante los cambios en diferentes versiones del
paquete.
- Export-Package
- Declara los paquetes que están visibles fuera del fragmento. Cualquier paquete que no esté declarado aquí sólo tiene visibilidad dentro del fragmento.
- Utilice esta propiedad para especificar el nombre de cualquier paquete al que desee exportar el fragmento en el tiempo de ejecución. Si no especifica los paquetes que necesitan otros paquetes de esta propiedad, no se podrán resolver los paquetes dependientes.