繁体   English   中英

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

[英]Java applet stopped working after update to JRE 7u21

一旦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)

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

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

我使用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)

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

  • 添加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新手,所以请不要忽视明显的解决方案......

在此先感谢您的帮助,

盖伊。

该错误很可能是因为缺少Jar文件,或者applet无法访问。 这将是因为:

  1. JAR位于旧JVM的类路径中,但不在新JVM上。
  2. 由于某种原因,您无意中分发了没有JAR的applet,并且问题与升级到7u2无关。
  3. 访问外部JAR文件的applet的规则有所改变,可能与安全性有关,你需要做一些其他事情来包含它们。

您缺少的JAR文件是javahidapi,可在此处找到: https//code.google.com/p/javahidapi/ 如果你确定它找到了通往classpath的路,你的applet就可以了。

Bailey S是对的。确保java可以看到那个jar文件。如果你正在使用linux,在/ etc / environment路径变量或windows中设置路径,只需右键单击我的计算机,转到属性,环境变量和在那里设置路径

随着Oracle修复安全漏洞,部署applet变得越来越困难。

您提到您的applet已签名 - 是否所有 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,或者没有全部签名的JAR,你也需要这里的详细信息: http//docs.oracle.com/javase/7/docs/technotes/guides /jweb/mixed_code.html

无法将applet的属性设置为在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)修复了这种不良行为。 所以我建议使用适用于Java 6和7.0.51的两个属性( Trusted-LibraryCaller-Allowable-Codebase )。 我认为7.0.21和7.0.45之间没有解决方案。 (我不支持他们,我们要求我们的客户升级到7.0.51)。

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

我不知道DeploJava.js这个问题显然是一个类路径问题。

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

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

同样的事情发生在我身上(在java环境中)毁了我一整天,netscape的JSObject存在于jre的plugin.jar和jfxrt.jar中,你需要排除一个。 如果你需要一个js调用,我认为你需要plugin.jar jre 6不包含最新的jfxrt.jar(Java中的applet的JavaFX相关解决方案)所以它曾经在jre6中工作

此外,除非您想单独签署单个罐子,否则不要使用受信任的库。 希望这有帮助 - Chaithanya

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM