Java 小程序在更新到 JRE 7u21 后停止工作

2022-09-04 23:20:29

我的java小程序在JRE更新到7u21后停止工作。

简短总结:

  • 我得到的例外是: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脚本中的“manifest”部分添加了以下行:

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 标头“缓存控制”=“无缓存”

  • 添加 HTTP 标头'缓存控制'='无缓存,无存储,必须重新验证'

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

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

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

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

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

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

提前感谢您的帮助,

家伙。


答案 1

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


答案 2

随着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,或者并非全部由您签名的 JAR,则还需要在此处提供详细信息:http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/mixed_code.html