Подтвердить что ты не робот

Java-апплет перестает работать после обновления до JRE 7u21

Мой java-апплет перестает работать, когда JRE обновлен до 7u21.

Краткое описание:

  • Исключения, которые я получаю: netscape.javascript.JSException и
    java.lang.NoClassDefFoundError. апплет работал нормально до тех пор, пока JRE 7u21.

  • Апплет встроен в веб-страницу с использованием Oracle DeployJava.js.

  • Апплет подписан, он использует LiveConnect для запуска событий, доступа к USB и последовательным портам через JNI, он использует код из нескольких файлов JAR.

  • Ошибка происходит во всех проверенных браузерах на рабочем столе (Firefox, Chrome, IE8/9 и Safari на Mac).

Подробнее:

  • У меня есть Java-апплет, который позволяет моему веб-сайту общаться с USB-устройством.

  • Апплет работает хорошо в течение прошлого года.

  • Как только было выпущено обновление JRE7 21, апплет перестает работать.

  • Апплет размещен на веб-странице (ASP.NET) с использованием библиотеки Oracle DeployJava.js.

  • Он использует LiveConnect, чтобы поднять события на мой код javascript.

Первой проблемой, с которой я столкнулся JRE 7u21, было исключение при первой попытке поднять событие через LiveConnect:

netscape.javascript.JSException: JavaScript error while calling "_notify"
at sun.plugin2.main.client.MessagePassingJSObject.newJSException(Unknown Source)
at sun.plugin2.main.client.MessagePassingJSObject.waitForReply(Unknown Source)
at sun.plugin2.main.client.MessagePassingJSObject.call(Unknown Source)
at <myapplet>.fireJavascriptEvent(Unknown Source)
at <myapplet>$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.asec.easypark.applets.HomeloadingApplet.start(Unknown Source)
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.start(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

чтобы смягчить эту проблему, я добавил следующую строку в раздел "манифест" в ant script для апплета:

attribute name="Trusted-Library" value="true" 

Я построил апплет с помощью JDK 7u21, и он помог:

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

Вторая проблема заключается в следующем: апплет вызывает код из нескольких файлов JAR. при первом вызове кода в другом JAR файле (а не в апплете) не выполняется следующее исключение:

**java.lang.NoClassDefFoundError**: com/codeminders/hidapi/HIDManager
    at <PackageInSecondJar>.communication.HIDTransmitter.open(Unknown Source)
    at <PackageInSecondJar>.communication.HIDTransmitterSearcher.find(Unknown Source)
    at <PackageInSecondJar>.communication.CompositeTransmitterSearcher.find(Unknown Source)
    at <PackageInAppletJar>.communication.AppletCommunicationBroker.setupDeviceProxy(Unknown Source)
    at <PackageInAppletJar>.communication.AppletCommunicationBroker.setup(Unknown Source)
    at <PackageInAppletJar>.<TheApplet>$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at <PackageInAppletJar>.<TheApplet>.start(Unknown Source)
    at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.start(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Я уже пробовал следующие меры - без успеха:

  • добавить HTTP-заголовок 'Cache-Control' = 'no-cache'

  • добавить HTTP-заголовок 'Cache-Control' = 'no-cache, no-store, must-revalidate'

  • используйте последнюю версию DeployJava.js из http://java.com/js/deployJava.txt (после переименования в .js)

Апплет уже имеет следующие функции:

  • отметьте безопасность всех разрешений в jnlp

  • основной JAR подписан с сертификатом из внешнего CA

  • код апплета выполняется внутри блока AccessController.doPrivileged.

Я новичок в java, поэтому, пожалуйста, не игнорируйте очевидные решения...

Заранее благодарим за помощь,

Гай.

4b9b3361

Ответ 1

Ошибка, скорее всего, из-за отсутствия файла Jar или недоступности апплета. Это было бы потому, что:

  • JAR был на пути к классу старой JVM, но не на новом.
  • По какой-то причине вы распространяете апплет без JAR непреднамеренно, и проблема не связана с обновлением до 7u2.
  • Правила для апплетов, обращающихся к внешним JAR файлам, каким-то образом изменились, вероятно, связаны с безопасностью, и вам нужно сделать что-то еще, чтобы включить их.

Недопустимый JAR файл - javahidapi, который можно найти здесь: https://code.google.com/p/javahidapi/. Если вы убедитесь, что он находит путь к пути к классам, ваш апплет будет работать.

Ответ 2

Bailey S прав. Убедитесь, что java может видеть этот файл jar. Если вы используете linux, задаете путь в переменной пути /etc/environment или в окнах, просто щелкните правой кнопкой мыши на моем компьютере, перейдите к свойствам, переменные окружения и установить путь там

Ответ 3

Развертывание апплетов становится значительно сложнее, поскольку Oracle исправляет дыры в безопасности.

Вы упомянули, что ваш апплет подписан - все ли подписаны JAR? В ваших файлах манифеста есть несколько новых атрибутов, чтобы заставить их работать.

Обзор здесь: http://www.oracle.com/technetwork/java/javase/tech/java-code-signing-1915323.html

и вам понадобится это, в частности, чтобы выяснить, что манифест был разобран: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html

Если вы используете некоторые JAR файлы, которые не подписаны или которые не подписаны вами, вам также понадобятся детали: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/mixed_code.html

Ответ 4

Невозможно установить атрибуты апплета для работы как в версиях после 7.0.21, так и ниже.

Trusted-Library: true
Атрибут

работает для тех, что ниже 7.0.21, что приводит к отображению диалогового окна безопасности (и, скорее всего, вашего кода для блокировки) после 7.0.21. Если вы положили

Caller-Allowable-Codebase: *.yourdomain.com

в файл манифеста, он начинает работать с версиями после 7.0.21, но на этот раз он останавливается с версиями ниже 7.0.21. Это огромный беспорядок.

Однако они исправили это плохое поведение с помощью последней версии (7.0.51). Поэтому я предлагаю использовать оба атрибута (Trusted-Library и Caller-Allowable-Codebase), которые будут работать для Java 6 и 7.0.51. Я не думаю, что есть решение для 7.0.21 и 7.0.45. (Я не поддерживаю их, мы просим наших клиентов обновиться до 7.0.51).

https://blogs.oracle.com/java-platform-group/entry/7u45_caller_allowable_codebase_and

Ответ 5

Я не знаю, что проблема с DeploJava.js возникла из-за проблемы, связанной с классом.

В качестве метода мы определяем все сторонние библиотеки в теге архива. DeploJava.js могут иметь схожие свойства.

<APPLET   codebase="./"  code="AppletMainClass"   archive="printer_applet.jar, pdf-renderer.jar, library3.jar">

Ответ 6

То же самое произошло со мной (в среде java), которая разрушила весь мой день, netscape JSObject присутствует как в jre plugin.jar, так и в jfxrt.jar, вам нужно его исключить. если вам нужен js-вызов, я думаю, вам понадобится plugin.jar jre 6 не содержит последнего jfxrt.jar(решение, связанное с JavaFX для апплетов в сети), поэтому он работал в jre6

также не используйте доверенную библиотеку, если вы не хотите подписывать отдельные банки отдельно. Надеюсь, это поможет - Чайтаня