ClassNotFoundException произошло, когда заменить банку во время выполнения
Я запускаю Java-приложение, упакованное в A.jar, в котором используются некоторые классы в B.jar.
Все связанные банки помещаются в определенный каталог, который включен в путь к классам.
Программа выглядит так:
main(){
run method ClassA.M1() in A.jar; //the method may keep running for 2 minutes
do some other prepare;
call method ClassB.M2 in B.jar;
}
Когда программа запускает M1, я вручную заменил B.jar на более новую версию (имя также B.jar).
Но программа выдает исключение ClassNotFoundException.
Затем снова запустите программу, и она работает нормально.
Итак, мой вопрос: почему выбрасывается ClassNotFoundException, так как путь к jar и имя jar не изменяются, загрузчик классов должен загрузить его без каких-либо проблем.
Дайте мне несколько указаний, пожалуйста.
1 ответ
Вы не можете просто изменить файлы JAR во время выполнения, заменив их файлами с тем же именем, потому что загрузчик классов, возможно, уже загрузил некоторые классы из него.
Если вам нужно поддерживать такое поведение, вам нужно изучить библиотеки или интегрированные среды, которые бы обеспечивали механизмы горячей замены.
Вот две статьи, которые помогут вам лучше понять загрузчики классов:
Есть много статей на эту тему и даже связанных вопросов здесь, на Stack OverFlow, я рекомендую вам прочитать больше.