Подтвердить что ты не робот

Перезагрузка ресурсов, загруженных getResourceAsStream

Следуя рекомендациям, я использую Thread.currentThread().getContextClassLoader().getResourceAsStream для загрузки ресурсов в веб-приложении (например, текстовые файлы или файлы xml) вместо того, чтобы проходить через API файлов.

Однако это имеет тот недостаток, что если ресурс изменяется на диске, следующий вызов getResourceAsStream продолжает возвращать старую версию неограниченно.

Я бы хотел, чтобы он поднял новую версию. В моем отладчике я вижу там простой HashMap, называемый resourceEntries в classLoader. Используя отражение, я смог удалить определенную запись, и это, похоже, работает.

Этот метод, однако, является хрупким.

Есть ли более стандартный способ сделать это?

4b9b3361

Ответ 1

В дополнение к ответу kschneid, который мог бы работать для Tomcat, я хотел добавить, что для JBoss AS 5+ он уже работает без каких-либо специальных трюков.

Кэширование ресурсов, скорее всего, относится к загрузчику класса. JBoss AS либо не кэширует, либо достаточно умен, чтобы увидеть, что ресурс на диске изменился.

Ответ 2

Попробуйте следующее:

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