Что произойдет, если я удалю файл xx.jar после того, как начал выполнять xx.jar - PullRequest
3 голосов
/ 23 апреля 2010

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

Когда я удаляю файл xx.jar, программа долгое время находилась в методе, но все еще находится в вызове этого метода. При вызове другого метода вызовет ошибку моей программы?

Я задаю этот вопрос, потому что, если удаление файла не принесет вреда, я получу примерно 3-4 часа на сервере

Ответы [ 4 ]

7 голосов
/ 23 апреля 2010

Нет гарантии, что JVM загрузит все классы из файла .jar в память, хотя она может предварительно загрузить некоторые или все .jar в качестве оптимизации.

Если это не удастся, и я предполагаю, что это произойдет в какой-то момент, это не произойдет во время выполнения метода. Это было бы в точке, где новый класс должен быть загружен из пути к классам, и JVM больше не может получить доступ к этому файлу. Тогда вы потерпите неудачу с NoClassDefFoundError или хуже.

Итак, нет, я бы определенно не советовал вам делать это, даже если в некоторых случаях это срабатывает.

3 голосов
/ 23 апреля 2010

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

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

0 голосов
/ 09 ноября 2016

Вы получите исключение NullPointerException, если ваш веб-контейнер - tomcat 7.0.59. Я сделал это несколько минут назад.

0 голосов
/ 23 апреля 2010

Вы узнаете, когда вы полностью развернете, повторно развернете приложение и перезапустите его.

Функциональность зависимости завершится сбоем, и будет выдано Expection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...