Как заменить динамическую библиотеку, загруженную в Java-апплет, не требуя полной перезагрузки браузера? - PullRequest
1 голос
/ 05 августа 2009

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

Проблема в том, что новая библиотека фактически не используется Java, пока пользователь не закроет и не перезапустит браузер (не вкладку, а весь браузер). Это то, чего я стараюсь избегать - нормально, если пользователю нужно обновить страницу или закрыть ее и открыть ее снова.

Я пытался копировать установленную библиотеку во временную папку каждый раз, когда запускается апплет, а затем всегда загружал эту копию, но безрезультатно. Кто-нибудь здесь когда-либо делал это? Есть хорошие идеи? Операционная система - Linux, JDK 1.5, Firefox.

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 августа 2009

Это именно та ситуация, описанная в этом сообщении об ошибке: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5075039 (В отчете говорится, что это относится к Windows, но на самом деле это проблема с Java)

У Java-кода нет возможности выгрузить собственную dll-библиотеку до тех пор, пока виртуальная машина не завершит работу. После загрузки библиотеки DLL она существует в течение всего срока службы JVM, и виртуальная машина гарантирует, что она будет загружена один раз и только один раз.

Единственный способ увидеть, как работает ваш сценарий, - это если вы как-нибудь выполните проверку версии и обновите до загрузки DLL. Как только он используется, вы застряли с ним.

0 голосов
/ 05 августа 2009

Java-классы могут быть выгружены только путем выгрузки загрузчика классов, которому они принадлежат. Поскольку библиотеки JNI зависят от класса-владельца, вам может потребоваться выгрузить загрузчик классов для класса, которому принадлежит библиотека.

Попробуйте создать экземпляр URLClassLoader для класса, взаимодействующего с библиотекой JNI, и создать экземпляры рассматриваемого класса с отражением. Если вы хотите выгрузить его, создайте новый загрузчик классов из обновленного JAR-файла, который ссылается на новую версию библиотеки (используйте другое имя файла библиотеки, чтобы можно было загружать обе версии одновременно, пока GC не позаботится о старой)

...