Перезагрузка DLL в апплете в браузере - PullRequest
2 голосов
/ 03 ноября 2010

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

У меня есть (подписано) апплет, который загружает DLL.Теперь, в прошлую пятницу, я нажимал «Обновить», и апплет перезагружался нормально, включая, очевидно, перезагрузку DLL.Но сегодня нажатие кнопки «Обновить» вызывает следующее исключение:

java.lang.UnsatisfiedLinkError: Native Library XXX already loaded in another classloader

В соответствии с Javadoc (Java 6) System.loadLibrary является вспомогательным методом для Runtime.loadLibrary и в соответствии с этой документацией:

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

Я знаю и понимаю, что вы не можете загрузить одну и ту же собственную библиотеку вразные загрузчики классов в одной и той же JVM, что объясняет вышеупомянутое исключение.То, что я пытаюсь доказать, это то, почему в один прекрасный день это сработало, а сейчас нет.Особенно с учетом того, что в процессе загрузки DLL не было никаких изменений кода.

Так что мои предположения таковы:

  1. В приведенной выше документации следует прочитать "второй и последующие вызовы * втот же загрузчик классов * игнорируется
  2. В прошлую пятницу планеты находились в другом выравнивании, и поэтому браузер использовал другую JVM (или, возможно, тот же загрузчик классов?), когда я нажимал на обновление, поэтому DLLбыл загружен правильно, и все работало хорошо.
  3. Сегодня планеты выровнены по-разному, и браузер повторно использует ту же JVM, но другой загрузчик классов, и это объясняет, почему я получаю эту ошибку сейчас.

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

Эти предположения кажутся разумными и правильными?t Я пропустил?

Заранее большое спасибо.

1 Ответ

1 голос
/ 03 ноября 2010

Звучит так: Проблема: встроенная библиотека уже загружена в другой загрузчик классов

Теперь они говорят о сервлетах, а не апплетах, но применимы многие из них.

Браузеры привязывают загрузчик классов к URL и, возможно, к соединению сокетов.Таким образом, перезагрузка будет повторно использовать тот же загрузчик классов, если браузер не будет сидеть достаточно долго, чтобы простаивать соединение, и в этот момент вы получите новый сокет и, следовательно, новый загрузчик классов.У нас было несколько апплетов на одной и той же странице, и было неуместно, будут ли они использовать загрузчик классов после перезагрузки страницы.

...