Pregunta

Tengo un proyecto que estoy tratando de convertir a OSGi. Sin embargo, este proyecto se ha creado con Guice como su administrador de inyección de dependencias. Es un gran proyecto con Guice entrelazado en todo momento. Guice me ha estado dando muchos ajustes con el proceso de conversión. Específicamente, me dieron un NoClassDefFoundError para com.google.inject.internal.cglib.reflect.FastClass. Me aseguré de que nada es un paquete privado y también descargué y utilicé guice-2.0-customloader.jar. Aún así, fue en vano.

¿Hay algún consejo de alguien que haya seguido este camino? Vale la pena mencionar que uso peaberry para obtener servicios dinámicos del entorno OSGi (para una arquitectura de tipo plugin) que luego uso en el programa más adelante.

Muchas gracias Steve

¿Fue útil?

Solución

Es difícil decir exactamente cuál es el problema, los problemas del cargador de clases pueden ser muy específicos de la situación en OSGi y difíciles de depurar.

Si guice realmente es un núcleo para su aplicación, puede tener sentido convertirlo en un paquete Fragment del System Bundle. El paquete del sistema es el nodo raíz en el árbol del cargador de clases para TODOS los paquetes. Si existen clases en este paquete, estarán accesibles en todas partes. Esta es una técnica que he utilizado con éxito para envolver Swing LAF (Sustancia, Aleación, Jide) como paquetes OSGi. Deben estar en el nivel raíz ya que todos mis paquetes usan Swing (especialmente el cargador de clases Swing)

Deberá verificar las especificaciones de OSGi para crear un paquete Fragment y hacer de ese paquete un fragmento de extensión de marco. Solo he podido hacer esto usando el tiempo de ejecución Equinox de Eclipse. En el momento en que escribí la mayoría de las clases de apoyo, Apache Felix aún no admitía fragmentos de extensión de marco. Puede haber cambiado ahora. No tengo idea sobre los frameworks (knopplefish, spring-dm)

Otros consejos

Solo use Peaberry . Tiene todo el soporte que necesita para usar Guice en OSGi. ¡No es necesario reinventar todo desde cero!

Supongo que sus comentarios sobre package-private están relacionados con esta página en Cargadores de clase de guice y puente ?

Hay un informe / parche de error que puede estar relacionado con su problema: http://code.google.com/p/google-guice/issues/detail?id=343

¿Has intentado agregar Guice y cglib al classpath estándar y hacer una delegación de arranque para ellos? Eso probaría / refutaría que su problema es el mismo que se menciona en el informe de error anterior.

Puede probar mi último parche para Issue 343 : acabo de adjuntar una compilación recién parcheada que es el último tronco de Guice más este parche, para que las personas puedan probarlo y dar su opinión.

El último parche evita muchas de estas excepciones CGLIB sin obligarlo a hacer públicas las clases, y también proporciona un mejor mensaje de error en los pocos lugares restantes donde esto todavía es necesario (básicamente cuando utiliza explícitamente la intercepción de métodos).

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