Pregunta

Estoy desarrollando paquetes OSGi usando Eclipse.Pruebo el código usando una configuración de tiempo de ejecución Eclipse OSGi.

El código funciona bien allí, pero cuando exporto los paquetes como archivos jar e intento usarlos en otro entorno (pax-runner, por ejemplo), obtengo excepciones ClassNotFound en tiempo de ejecución.Los paquetes se instalan bien, sin errores.Ejecuto el comando en el equinoccio:"número de paquete de diagnóstico" y dice:"Sin restricciones no resueltas" para cada paquete.

Me gustaría saber si existe una herramienta/método para saber, para un paquete .jar determinado, si necesita alguna biblioteca externa, que no se describe en manifest.mf.

¿Fue útil?

Solución

Su paquete resolverá si todos los paquetes listados en Import-Package (y los paquetes listados en Require-Bundle) se encuentran en tiempo de ejecución. Si obtiene ClassNotFoundException o NoClassDefFoundError después de resolver, que significa que el contenido de Import-Package estaba mal.

Tome un vistazo a la href="http://www.aQute.biz/Code/Bnd" rel="nofollow noreferrer"> herramienta . Esto lleva a cabo la inspección estática del código de bytes compilado de sus clases para descubrir las dependencias exactas, y se genera la instrucción Import-Package para usted. En general, si se utiliza Bnd, nunca se debe ver ClassNotFound / noClassDefFound menos que cargar dinámicamente clases por su nombre, por ejemplo, con Class.forName().

Otros consejos

JBoss acaba de lanzar una herramienta de diagnóstico de código abierto fantástico de dependencias: http://jboss.org/tattletale

Una de las características es analizar los archivos jar por introspección, para encontrar todas las dependencias que carecen.

Hice algo como esto hace un tiempo (estaba compilando Java en .NET a través de IKVM, pero necesitaba las dependencias entre Jars). Analizador de tarros para crear un gráfico de dependencias.

He tenido éxito con la herramienta bundlor-caparazón de SpringSource. Hay instrucciones para usarlo aquí . Se le da un frasco, junto con un nombre y una versión para el nuevo paquete que desea crear a partir de ese JAR. A continuación, analiza los archivos de clase dentro de la jarra y produce un manifiesto plantilla que las importaciones cualquier paquete que encuentra referencias a.

La parte difícil es entonces resolviendo qué dependencias son opcionales, y qué versión de cada paquete que depende de. Hay que leer la página web, notas de la versión, etc., para la biblioteca de resolver esto.

Usted recibirá "No hay restricciones sin resolver" si el paquete en realidad no importar cualquier paquete o paquetes requieren otros; en lo que se refiere al tiempo de ejecución de OSGi, el haz será utilizable. Pero tan pronto como se accede a una clase externa, como en su caso, obtendrá la ClassNotFoundException temido.

El entorno de desarrollo de complementos (PDE) de Eclipse le dará errores de compilación si su código utiliza clases que no figuran en MANIFEST.MF.Las excepciones ClassNotFound en tiempo de ejecución a menudo se deben a que se marcan incorrectamente las importaciones de paquetes como opcionales: los paquetes se resuelven, pero no funcionarán.Compilar con una versión diferente de un paquete o paquete con respecto a la que está ejecutando también podría causar este tipo de error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top