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, поэтому, пожалуйста, не игнорируйте очевидные решения...
Заранее благодарим за помощь,
Гай.
Ответы
Ответ 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
также не используйте доверенную библиотеку, если вы не хотите подписывать отдельные банки отдельно.
Надеюсь, это поможет - Чайтаня