java - La instalación de una nueva versión de Groovy en mi entorno OSGi hace que mi paquete lo importe, aunque no debería
(1)
No use un rango de versiones. Establecer explícitamente la versión de groovy.util Esto puede no parecer útil, pero creo que funcionará. Obtenemos un problema muy similar cuando tratamos de generar archivos Karaf features.xml en dependencias con rangos de versión (trabajamos alrededor de esto escribiendo nuestro propio complemento que eliminó el elemento superior versionado del archivo de características finalizadas :()
Tengo un pequeño paquete que usa Groovy para interpretar guiones.
La instrucción manifiesto Import-Package se ve así:
Import-Package: groovy.util;version="[1.8,2)"
El rango de versiones anterior indica claramente que la versión de importación debe estar entre 1.8 (inclusive) y 2.0 (exclusiva).
Cuando ejecuto este paquete en un entorno OSGi con solo Groovy 1.8.6 instalado, funciona como se esperaba ... cuando escribo inspect package requirement 4
, imprime:
-> com.athaydes.gradle.osgi.groovy-1-8-6-runner [4] imports packages:
------------------------------------------------------------------
ipojo.example.code; version=0.0.0 -> com.athaydes.gradle.osgi.code-runner-api [1]
groovy.util; version=1.8.6 -> groovy-all [5]
Esto es exactamente como esperaba, y cuando pido al CodeRunner que interprete este fragmento de Groovy:
GroovySystem.version
Devuelve correctamente 1.8.6
.
Ahora, cuando inicio mi entorno OSGi con Groovy 1.8.6 y 2.3.3 instalados, cuando inspecciono los paquetes para mi paquete, obtengo esto en su lugar:
-> com.athaydes.gradle.osgi.groovy-1-8-6-runner [4] imports packages:
------------------------------------------------------------------
ipojo.example.code; version=0.0.0 -> com.athaydes.gradle.osgi.code-runner-api [1]
La importación de groovy.util
se ha ido (¡aunque MANIFEST todavía la tiene, por supuesto)! Y ahora, cuando ejecuto GroovySystem.version
obtengo 2.3.3, ¡no 1.8.6 como debería ser!
Esto es una locura, parece que el simple hecho de que una versión más nueva de Groovy esté presente está rompiendo la promesa de OSGi de que debería ser capaz de usar cualquier versión de dependencia que desee.
He probado esto en Felix y Equinox, con exactamente el mismo resultado.
También utilicé una versión exacta en el manifiesto en lugar de un rango, pero eso no cambió nada.
¿Alguien puede ver qué está pasando exactamente aquí?
PD. si no me cree, pruébese, aquí está el proyecto en GitHub: https://github.com/renatoathaydes/osgi-run/tree/next/osgi-run-test/ipojo-dosgi