13

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

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

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

  • 在 jnlp 中标记安全性“所有权限”

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

  • 小程序代码在AccessController.doPrivileged块内运行。

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

在此先感谢您的帮助,

家伙。

4

5 回答 5

1

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

于 2013-06-07T18:20:56.410 回答
1

无法将小程序的属性设置为在 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-Library和)。Caller-Allowable-Codebase我认为对于 7.0.21 和 7.0.45 之间的版本没有解决方案。(我不支持他们,我们要求我们的客户升级到 7.0.51)。

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

于 2014-01-31T18:34:19.260 回答
1

随着 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

于 2013-11-08T21:14:28.930 回答
0

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

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

于 2014-11-06T19:30:02.280 回答
0

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

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

<APPLET   codebase="./"  code="AppletMainClass"   archive="printer_applet.jar, pdf-renderer.jar, library3.jar">
于 2013-05-28T13:57:21.977 回答