Файлы JAR не загружаются в объемную память, как это делают другие библиотеки общих объектов. Их классы загружаются в память по требованию, поэтому, если вы удаляете JAR-файл и должен выполняться поиск класса, файл, обрабатывающий загрузчик класса, будет недействительным (поскольку открытый файл, на который он ссылается, теперь исчез), и вы получите ошибка.
Операционные системы управляют файловыми дескрипторами, поэтому замена открытого файла на новую копию никого не обманет. Сначала вам нужно закрыть файл, который часто может выполняться только с помощью мусора, собирающего загрузчик классов. Если вы используете загрузчик системного класса, это означает, что вы отключите JVM.
Люди написали рамки для создания пользовательских загрузчиков классов, которые могут быть удалены независимо от загрузчика системного класса; однако это усложняет загрузку классов. Хотя он может выполнить то, что вы просите, он не может этого сделать, не реструктурируя вашу существующую программу, чтобы приспособить поиск классов в загрузчиках классов фреймворка (и с учетом потерь и выигрыша загрузчиков классов с течением времени).
Если вы хотите попробовать такую структуру, см. Пост Христиана. Если вы хотите узнать немного больше о том, как один проект использует загрузчики классов для облегчения его потребностей, загляните под обложки Tomcat от Apache, что ограничивает веб-приложения в своих собственных загрузчиках классов.
Часто вы можете обнаружить, что правильным ответом является прекращение службы до развертывания и запуск после развертывания.
Почему бы не остановить выполнение, заменить банку и перезапустить ее? –
время - деньги :) – LordDoskias
Тогда вы могли бы написать сценарий. Отбросьте обновленную банку в определенную папку, запустите скрипт, который ее остановит, копирует новую банку и снова запускает ее. –