Загрузчик классов апплета не может найти один из классов в банке - PullRequest
5 голосов
/ 24 февраля 2010

Я получаю фф. иногда в консоли Java:

Exception in thread "thread applet-my.package.MyApplet-10" java.lang.NoClassDefFoundError: another/package/SomeClass
    at my.package.MyApplet.init(MyApplet.java:95)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: another.package.SomeClass
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    ... 3 more
Caused by: java.io.IOException: open HTTP connection failed:https://myserver/mycontext/applets/another/package/SomeClass.class
    at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    ... 7 more

Мой тег апплета выглядит следующим образом:

<applet codebase="../../applets" code="my.package.MyApplet" class="invisible" id="myApplet">
  <param value="value0" name="param0"/>
  ...
  <param value="valueN" name="paramN" />
  <param value="folder/myApplet__0.0.1177.jar,folder/commons-io-1.3.2__0.0.1177.jar,..." name="cache_archive"/>
  <param value="0.0.1177.0,0.0.1177.0,...," name="cache_version"/>
</applet>

Важно подчеркнуть слово «изредка». Иногда апплет инициализируется без заминки. Это также означает, что часто при перезапуске браузера проблема исчезает.

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2010
Caused by: java.io.IOException: open HTTP connection failed:https://myserver/mycontext/applets/another/package/SomeClass.class

Похоже, что существует проблема с подключением при получении файла JAR с HTTPS-сервера.

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

Если это не проблема, убедитесь, что для вашего JAR-файла достаточно кеширования при загрузке, иначе он не запустится. К сожалению, это не проблема кода.

ОБНОВЛЕНИЕ Ваш класс SomeClass имеет доступ к любому удаленному серверу или базе данных случайно?

Исключение ясно показывает, что в привилегии AccessControl отказано.

at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)

Помните, что апплеты похожи на Flash-объекты:

  • Они оба загружаются и запускаются со стороны клиента.

Единственное отличие состоит в том, что апплеты были разработаны с множеством правил контроля доступа, таких как, они не должны подключаться к серверам, скрытым за демилитаризованной зоной компании и т. Д.

Если это так, я предлагаю вам найти способ извлечения данных вне апплетов (попробуйте сервлет?)

ОБНОВЛЕНИЕ 2 Кажется, JVM не может найти доверенный сертификат, соответствующий вашему подписанному банку.

  1. Поскольку ваш файл JAR подписан , убедитесь, что файл JAR может указывать на ваш доверенный сертификат (помните, он должен быть доверенным).
  2. Больше информации, проверьте: http://faq.javaranch.com/java/HowCanAnAppletReadFilesOnTheLocalFileSystem И http://www.developer.com/article.php/3303561
0 голосов
/ 21 марта 2011

Возможно, это как-то связано с http://download.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html. Т.е. один или несколько банок определяют / ожидают поставщика. Расследуйте, когда будет время.

...