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