2011-09-19 14 views
5

Creé un paquete en Eclipse y usé el enlace "Iniciar el Framework" para la pestaña "Descripción general". He creado una interfaz (TestService) en mi paquete, y un código que debería generar un proxy para él (en Helper). Yo llamo a este código en el activador del paquete, y sale:¿Cómo se crea/inicializa Javassist ClassPool dentro de un OSGi Bundle?

Caused by: javassist.NotFoundException: com.test.services.TestService 
at javassist.ClassPool.get(ClassPool.java:436) 
at com.test.services.Helper.get(Helper.java:46) 

Se lanza a la derecha en la primera ClassPool.get():

ClassPool pool = ClassPool.getDefault(); 
CtClass result = pool.get(TestService.class.getName()); 
... 

TestService es público y en el mismo paquete, y Bundle, como el Ayudante, que genera la Excepción. Obviamente, no es lo suficientemente bueno para hacer "ClassPool.getDefault()". Entonces, ¿qué debo hacer para que ClassPool vea las clases dentro del paquete? ¿Debo importar mis propios paquetes?

+0

Supongo que el paquete javassist en sí mismo necesitaría visibilidad de las clases que está pidiendo que cargue. Lamentablemente, no sé cómo javassist busca clases. ¿Puedes decir qué cargador de clases usar, o solo tiene una conjetura aleatoria? ¿Puede configurarse con objetos reales de "Clase", o insiste en los nombres de clase proporcionados como cadenas? –

+0

Estoy empezando con Javassist, así que no estoy seguro, pero lo veré esta noche y te responderé. Pero, sospecho que ya has señalado ese problema; OSGi limita los paquetes que un Bundle puede ver, por lo que podría ser suficiente para agregar mi propio paquete en el "paquete de importación" del Paquete de Javassist. –

Respuesta

2

Uso javassist en algunos paquetes OSGi para modificar/generar clases Java sobre la marcha. Solo puede mirar here. Espero que te ayude

+0

No pude hacer que funcione con Javassit en su propio paquete, porque tengo una dependencia circular, pero no entiendo cómo incorporar el jarrón Javassit en el paquete con mi código. Simplemente tendré que "asumir" que funciona, hasta que encuentre instrucciones utilizables sobre cómo hacer la inserción manualmente (sin usar Maven). –

+0

¿Qué herramienta usas para construir tu paquete OSGi? ¿Hormiga? Puede usar la herramienta http://www.aqute.biz/Bnd/Bnd directamente para incrustar el jar y crear el paquete. –

+0

Estoy usando Bnd, pero recién comencé. Estoy leyendo "OSGi in Practice" y el autor usa Bnd. Pero acabo de terminar el capítulo dos, así que no he leído acerca de la incrustación. De todos modos, creo que este es el enfoque equivocado para mí. Como sé exactamente lo que debería "generar" en tiempo de compilación, tendría más sentido para mí usar Javassist en tiempo de compilación. Eso haría una dependencia menos de tiempo de ejecución, mientras solucionaba el problema de la vía de acceso de clases al mismo tiempo. –

10

Si "fuente" es un objeto cargado por un cargador de clases OSGi paquete, puede el correspondiente "ruta de clases" (o cargador de clases) a la ClassPool, así:

pool.insertClassPath(new ClassClassPath(source.getClass())); 

o en su caso, simplemente

pool.insertClassPath(new ClassClassPath(TestService.class)); 

Espero que ayude.

Cuestiones relacionadas