Поменять беговую банку во время выполнения - PullRequest
5 голосов
/ 01 сентября 2010

Я создаю систему обновлений, в которой мне нужно иметь возможность заменять ссылочный файл jar запущенного приложения во время выполнения.Тем не менее, я сталкиваюсь с проблемами блокировки файлов в Windows, когда пытаюсь выполнить функции утилиты файлов на банке, такие как 'setLastModified'.

После некоторого поиска в Google я нашел этот фрагмент ...

В моих исследованиях я обнаружил, что стандартная реализация ClassLoader никогда не закрывает файл jar после его открытия.Он также загружает ресурсы только из файла JAR по мере необходимости.Поэтому в любой конкретный момент в jar-файле могут быть классы, которые не были загружены в память.Очевидно, что если вы удалите файл JAR из-под ClassLoader, и он попытается найти ресурс в отсутствующем файле, вы получите IOException по крайней мере.

Кто-нибудьесть какие-либо ссылки на информацию об этом или обойти эту проблему?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 01 сентября 2010

Существует множество решений для горячей замены классов / lib:

Это зависит от того, что вы хотите сделать.

2 голосов
/ 01 сентября 2010

Ближайшая вещь OSGi

Пожалуйста, ознакомьтесь с разделом «Смотрите также» вышеупомянутой статьи о бетонных изделиях.

0 голосов
/ 01 сентября 2010

Я не знаю ни одного хорошего способа справиться с этим.Создание пользовательского загрузчика классов может быть вариантом, хотя мне не нравится эта идея.

Мы обошли его, запустив программу обновления из отдельного jar-файла перед запуском основного приложения.Это работает достаточно хорошо, но, очевидно, вы можете обновить jar только при запуске приложения.

...