Как позволить загрузчику классов загружать классы из измененного фляги? - PullRequest
0 голосов
/ 08 сентября 2011

У нас есть серверное приложение Java6, работающее на нескольких серверах Linux.Иногда кто-то случайно обновляет файл JAR во время работы приложения.

Когда это происходит, следующая попытка загрузить класс, который еще не использовался (часто это код ShutdownHandler), завершается с ClassNotFoundException.

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

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

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

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

Вы должны сделать это так, или instanceof с друзьями не будет работать правильно.(Если вы хотите узнать больше об этом, изучите все мелкие детали JNDI).

Самый простой способ сделать это - написать его как веб-приложение (WAR) и развернуть его вКонтейнер сервлетов, в котором все, что вам нужно сделать, выполняется как часть установки и демонтажа веб-приложения.Контейнеру сервлетов не требуется наличие веб-сервера (прослушиватель http-порта и т. Д.).

Большинство современных контейнеров сервлетов допускают автоматическое повторное развертывание.Хороший, маленький - Причал.

0 голосов
/ 08 сентября 2011

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

Реальный ответ - не менять приложение во время его работы.

...