Как удалить файл, который используется / заблокирован окнами в Java - PullRequest
6 голосов
/ 17 ноября 2009

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

Кто-нибудь знает какой-нибудь обходной путь?

Ответы [ 4 ]

4 голосов
/ 17 ноября 2009

Одним из популярных решений для этого является запуск вашего обновления как отдельной программы. Вы когда-нибудь замечали, что Firefox должен перезагружаться при обновлении? Это потому, что отдельный процесс (updater.exe) обновляет файлы, а затем снова запускает Firefox.

Вы можете попробовать этот подход. Единственное препятствие, которое я вижу на пути, - это попытка автоматизировать ОСНОВНУЮ программу, чтобы закрыть себя. Единственный переносимый способ сделать это (в моей голове) состоит в том, чтобы основное приложение ожидало сигнала уничтожения через локальный сокет, а программа обновления могла отправить команду через локальную сеть. Еще одна вещь, которую вы должны учитывать, это то, что программа обновления должна запускаться в отдельном Java-процессе. Если ваша основная программа просто создает новый объект Updater, Updater будет сосуществовать с JVM основной программы, что возвращает вас к исходной точке.

2 голосов
/ 17 ноября 2009

Это проблема уже решена OSGi.

Настоящая проблема не в том, чтобы загрузить новую версию фляги. Это можно сделать с помощью собственного загрузчика классов, который снимает блокировку файла. Реальная проблема в том, как обрабатывать экземпляры разных версий одного и того же класса .

Перезагрузка не решает эту проблему. Если вам действительно нужны разные версии jar в одном приложении, используйте OSGi.

2 голосов
/ 17 ноября 2009

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

0 голосов
/ 17 ноября 2009

Типичный способ сделать это - написать отдельный модуль обновления, который будет вызываться вашей основной программой, когда он увидит обновление. В это время ваша основная программа может запустить программу обновления в новом процессе и выйти. Ваш апдейтер может дождаться выхода основной программы, загрузить и скопировать обновленные файлы и перезапустить основную программу

...