2012-05-24 5 views
3

У меня есть часть программного обеспечения, содержащаяся в одном .jar, который выполняет свою работу, но иногда мне нужно быстро нажать исправление ошибки, требуя замены файла .jar в центральном месте, к сожалению, если в настоящее время выполняется этот файл jar, если я его заменяю, он вылетает с ошибкой «class not found». Я думал, что как только файл jar будет запущен, JVM будет кэшировать его в памяти и не будет делать никаких чтений с диска, но, видимо, это не так, как можно (если возможно вообще) это исправить?Сбой программы Java при замене основной банки

EDIT:

не веб-приложение. Это нормальный Java SE.

+1

Почему бы не остановить выполнение, заменить банку и перезапустить ее? –

+0

время - деньги :) – LordDoskias

+0

Тогда вы могли бы написать сценарий. Отбросьте обновленную банку в определенную папку, запустите скрипт, который ее остановит, копирует новую банку и снова запускает ее. –

ответ

3

Файлы JAR не загружаются в объемную память, как это делают другие библиотеки общих объектов. Их классы загружаются в память по требованию, поэтому, если вы удаляете JAR-файл и должен выполняться поиск класса, файл, обрабатывающий загрузчик класса, будет недействительным (поскольку открытый файл, на который он ссылается, теперь исчез), и вы получите ошибка.

Операционные системы управляют файловыми дескрипторами, поэтому замена открытого файла на новую копию никого не обманет. Сначала вам нужно закрыть файл, который часто может выполняться только с помощью мусора, собирающего загрузчик классов. Если вы используете загрузчик системного класса, это означает, что вы отключите JVM.

Люди написали рамки для создания пользовательских загрузчиков классов, которые могут быть удалены независимо от загрузчика системного класса; однако это усложняет загрузку классов. Хотя он может выполнить то, что вы просите, он не может этого сделать, не реструктурируя вашу существующую программу, чтобы приспособить поиск классов в загрузчиках классов фреймворка (и с учетом потерь и выигрыша загрузчиков классов с течением времени).

Если вы хотите попробовать такую ​​структуру, см. Пост Христиана. Если вы хотите узнать немного больше о том, как один проект использует загрузчики классов для облегчения его потребностей, загляните под обложки Tomcat от Apache, что ограничивает веб-приложения в своих собственных загрузчиках классов.

Часто вы можете обнаружить, что правильным ответом является прекращение службы до развертывания и запуск после развертывания.

1

Единственные две возможности, которые я могу придумать, - использовать JRebel или OSGi.

Смежные вопросы