更新到JRE 7u21后,Java applet停止工作

use*_*788 13 java security applet mixed-code

一旦JRE更新到7u21,我的Java applet就停止了工作.

简短的摘要:

  • 我得到的例外是:netscape.javascript.JSException和
    java.lang.NoClassDefFoundError.小程序工作正常,直到JRE 7u21.

  • applet使用Oracle的DeployJava.js嵌入到网页中.

  • 小程序已签名,它使用LiveConnect来触发事件,它通过JNI访问USB和串行端口,它使用来自多个JAR文件的代码.

  • 所有测试的桌面浏览器(Firefox,Chrome,IE8/9和Mac上的Safari)都会出现故障.

细节:

  • 我有一个java applet,允许我的网站与USB设备通信.

  • 小程序在过去一年中运作良好.

  • 一旦JRE7更新21发布 - applet就停止了工作.

  • applet使用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)
Run Code Online (Sandbox Code Playgroud)

为了缓解这个问题,我在applet的ant脚本中的'manifest'部分添加了以下行:

attribute name="Trusted-Library" value="true" 
Run Code Online (Sandbox Code Playgroud)

我使用JDK 7u21构建了applet,它似乎有所帮助:

之后我开始收到另一个错误 - 所以我相信这个错误已经解决了,但它可能导致了下一个问题.

第二个问题是:applet从几个JAR文件调用代码.在第一次调用另一个JAR文件(不是applet的文件)中的代码失败时出现以下异常:

**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)
Run Code Online (Sandbox Code Playgroud)

我已经尝试了以下措施 - 没有成功:

  • 添加HTTP标头'Cache-Control'='no-cache'

  • 添加HTTP标头'Cache-Control'='no-cache,no-store,must-revalidate'

  • 使用来自http://java.com/js/deployJava.txt的最新DeployJava.js (在重命名为.js之后)

小程序已经具有以下功能:

  • 在jnlp中标记安全性'all-permissions'

  • 主JAR使用外部CA的证书进行签名

  • applet代码在AccessController.doPrivileged块内运行.

我是一个java新手,所以请不要忽视明显的解决方案......

在此先感谢您的帮助,

盖伊.

小智 0

我不知道 DeploJava.js 但问题 \xc4\xb1s 显然是一个类路径问题。

\n\n

作为一种方法,我们在 archive 标签中定义所有第三方库。DeploJava.js 可能具有类似的属性。

\n\n
<APPLET   codebase="./"  code="AppletMainClass"   archive="printer_applet.jar, pdf-renderer.jar, library3.jar">\n
Run Code Online (Sandbox Code Playgroud)\n