2011-01-20 16 views
12

Siguiendo las prácticas recomendadas, estoy usando Thread.currentThread().getContextClassLoader().getResourceAsStream para cargar recursos en una aplicación web (como archivos de texto o archivos xml), en lugar de pasar por el archivo API.Recarga de recursos cargados por getResourceAsStream

Sin embargo, esto tiene la desventaja de que si el recurso cambia en el disco, una llamada siguiente a getResourceAsStream sigue devolviendo la versión anterior indefinidamente.

Me gustaría que recogiera la nueva versión. En mi depurador veo que hay un HashMap simple llamado resourceEntries en el classLoader. Usando el reflejo, he podido eliminar una entrada específica y parece que funciona.

Este método es sin embargo frágil.

¿Hay una forma más estándar de hacer esto?

+0

¿Cuál es la implementación exacta de 'ClassLoader' que contiene eso? – Bozho

+0

En este caso era '' org.apache.catalina.loader.WebappClassLoader'' en Tomcat 5. No he probado nuevas versiones de Tomcat aún, pero lo probé en JBoss y no funciona allí (como se esperaba). – akira

Respuesta

1

Además de la respuesta de kschneid que podría trabajar para Tomcat de hecho, quería añadir que para JBoss AS 5+ ya parece funcionar sin necesidad de ningún truco especial.

El almacenamiento en memoria caché de los recursos es probablemente un cargador de clases específico. El JBoss AS no guarda en caché o es lo suficientemente inteligente como para ver que el recurso en el disco ha cambiado.

6

Prueba esto:

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader(); 
URL resURL = ctxLoader.getResource(resName); 
URLConnection resConn = resURL.openConnection(); 
resConn.setUseCaches(false); 
InputStream resIn = resConn.getInputStream(); 
... 
Cuestiones relacionadas