一旦 JRE 更新到 7u21,我的 java 小程序就停止工作了。
简短的摘要:
我得到的异常是:netscape.javascript.JSException 和
java.lang.NoClassDefFoundError。该小程序在 JRE 7u21 之前运行良好。该小程序使用 Oracle 的 DeployJava.js 嵌入到网页中。
小程序已签名,它使用 LiveConnect 触发事件,它通过 JNI 访问 USB 和串行端口,它使用来自多个 JAR 文件的代码。
失败发生在所有测试的桌面浏览器(Firefox、chrome、IE8/9 和 Mac 上的 Safari)上。
细节:
我有一个 Java 小程序,它允许我的网站与 USB 设备进行通信。
该小程序在过去一年中运行良好。
一旦 JRE7 更新 21 发布 - 小程序停止工作。
小程序托管在使用 Oracle 的 DeployJava.js 库的网页 (ASP.NET) 中。
它使用 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 脚本中的“清单”部分添加了以下行:
attribute name="Trusted-Library" value="true"
我使用 JDK 7u21 构建了小程序,它似乎有帮助:
之后我开始遇到另一个错误 - 所以我相信这个问题已经解决,但它可能导致了下一个问题。
第二个问题是:applet 正在从几个 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'
使用来自http://java.com/js/deployJava.txt的最新 DeployJava.js (重命名为 .js 后)
该小程序已经具有以下功能:
在 jnlp 中标记安全性“所有权限”
主 JAR 使用来自外部 CA 的证书进行签名
小程序代码在
AccessController.doPrivileged
块内运行。
我是一个java新手,所以请不要忽视明显的解决方案......
在此先感谢您的帮助,
家伙。