Archivos para 12/03/08

12
Mar
08

Subidas nuevas versiones de los componentes

Antes de ayer subí las nuevas versiones de los componentes, el mas importante es el manager de plugins, el cual me ha dado muchísimos quebraderos de cabeza, pero finalmente lo tengo funcionando sobre Spring.
Me gustaría comentar el principal y mas paranoico error que he tenido, por que no hay referencias en inet, o yo no las he encontrado (es un fallo muy raro, asi que supongo que será normal que no encontrara nada al respecto), y para solucionarlo he tenido que empaparme bien del funcionamiento de Java. (No hay mal que por bien no venga)
No tenia errores, el fallo era en tiempo de ejecución, y lo que ocurria era que me daba un ClassCastingException debido a que intentaba usar una clase mediante su interfaz, pero habiendo instanciado dicha clase dinamicamente. El problema tenia su base en que la Interfaz era instanciada por un ClassLoader distinto del que usaba para instanciar la Clase.
Y para mas locura, este fallo solo sale a la luz cuando el manager no lo instancio yo, si no que lo instancia Spring y por IoC me lo inyecta a mi clase.
Esto bien pensado, ahora que se la solicion, parece evidente.
Finalmente solucione el problema (me ha costado meses, abandonandolo por imposible y retomandolo varias veces), haciendo que la Clase (en este caso del plugin) la instancie el mismo ClassLoader que me habia instanciado la Interfaz. Esto lo hago con la linea:
ClassLoader cargador = new URLClassLoader(getJarsDeDependencias(), this.getClass().getClassLoader());
Que la ejecuta el archivo PluginManager.java.
De este modo utilizare como ClassLoader el mismo que me haya instanciado el Manager de Plugins (el que haya utilizado Spring), y luego podre realizar correctamente el casting.

Anteriormente, el utilizaba un nuevo ClassLoader con el codigo:
ClassLoader.getSystemClassLoader()

Lo cual provocaba la incompatibilidad de ClassLoaders que he comentado.

Lo dicho, el manager de plugins esta subido y funcionando ! ! ! ;-)