2011-01-20 15 views
12

Korzystając ze sprawdzonych metod, używam Thread.currentThread().getContextClassLoader().getResourceAsStream do ładowania zasobów w aplikacji internetowej (takich jak pliki tekstowe lub pliki xml) zamiast przechodzenia przez interfejs API pliku.Ponowne ładowanie zasobów załadowanych przez getResourceAsStream

Ma to jednak tę wadę, że jeśli zasób ulegnie zmianie na dysku, następujące wywołanie getResourceAsStream powoduje nieodwracalne zwrócenie starej wersji.

Chciałbym jednak, aby odebrał nową wersję. W moim debugerze widzę prostą mapę HashMap o nazwie resourceEntries w klasieLoader. Korzystając z refleksji, udało mi się usunąć konkretny wpis i wydaje się, że działa.

Ta metoda jest jednak delikatna.

Czy istnieje bardziej standardowy sposób na zrobienie tego?

+0

jaka jest dokładna implementacja 'ClassLoader', która to posiada? – Bozho

+0

W tym przypadku był to '' org.apache.catalina.loader.WebappClassLoader'' w Tomcat 5. Nie próbowałem jeszcze w nowszych wersjach Tomcat, ale po prostu wypróbowałem go w JBoss i nie działa tam (zgodnie z oczekiwaniami). – akira

Odpowiedz

1

Oprócz odpowiedzi kschneid, który może pracować dla Tomcat Rzeczywiście, chciałem dodać, że dla JBoss AS 5+ to już wydaje się działać bez potrzeby żadnych specjalnych sztuczek.

Buforowanie zasobów jest prawdopodobnie specyficzne dla programu ładującego klasy. JBoss AS nie buforuje ani nie jest wystarczająco inteligentny, aby zobaczyć, że zmieniono zasoby na dysku.

6

Spróbuj tego:

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader(); 
URL resURL = ctxLoader.getResource(resName); 
URLConnection resConn = resURL.openConnection(); 
resConn.setUseCaches(false); 
InputStream resIn = resConn.getInputStream(); 
... 
Powiązane problemy