Я запускаю Java-приложение, которое большую часть времени загружено. Когда мне нужно обновить его, я отправляю ему сообщение, чтобы он завершил работу при ближайшей возможности, затем обновляю файлы классов и перезапускаю его. Что я действительно хотел бы сделать, так это обновить файлы классов, а затем заставить программу запустить себя при следующей удобной возможности, но я обнаружил (это solaris), что если вы измените файлы на диске во время работы программы иногда случаются плохие вещи. Я предполагаю, потому что не все файлы классов находятся в jvm все время, поэтому иногда приходится перезагружать с диска, или, возможно, solaris загружает части файла с диска, которые не соответствуют старому двоичному файлу. Я видел это и с двоичными файлами C. Какие-либо предложения? Будет ли безопаснее выполнить перемещение и копирование, чтобы та же информация о диске не перезаписывалась, а для нового файла создавался новый индексный дескриптор?
Также обратите внимание на автоматизацию обновления с помощью веб-старта (который имеет дополнительные ограничения) или интеграцию обновления в сценарий запуска, например, что-то вроде этого: 1. проверьте, есть ли какие-либо файлы в новом /, скопируйте их в производство 2. запустите приложение
Таким образом, все, что вам нужно, - это перезапуск. И вы можете копировать, rsync, ftp, ...
Перезапись jar-файлов / классов не работает. Причина проста: вы можете загрузить класс в память, затем выгружать его из-за нехватки памяти, а затем повторно загружать его. Если вы измените базовый файл класса, вы получите новый класс со старой системой, что создает проблемы.
Лучше всего встроить горячее развертывание в приложение (или попросить разработчиков встроить его) с помощью таких решений, как:
или что вам больше подходит.