JRE が 7u21 に更新されると、Java アプレットが動作しなくなりました。
簡単な要約:
私が取得する例外は、netscape.javascript.JSException と
java.lang.NoClassDefFoundError です。アプレットは JRE 7u21 まで正常に動作しました。アプレットは、Oracle の DeployJava.js を使用して Web ページに埋め込まれます。
アプレットは署名され、LiveConnect を使用してイベントを起動し、JNI を介して USB およびシリアル ポートにアクセスし、複数の JAR ファイルのコードを使用します。
テストしたすべてのデスクトップ ブラウザー (Firefox、Chrome、IE8/9、および Mac 上の Safari) でエラーが発生します。
詳細:
Web サイトが USB デバイスと通信できるようにする Java アプレットがあります。
このアプレットは、この 1 年間、うまく機能しています。
JRE7 update 21 がリリースされると、アプレットが機能しなくなりました。
アプレットは、Oracle の DeployJava.js ライブラリを使用して Web ページ (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 を使用してアプレットを構築しました。
その後、別のエラーが発生し始めたので、これは解決されたと思いますが、次の問題が発生した可能性があります。
2 つ目の問題は、アプレットが複数の JAR ファイルからコードを呼び出していることです。別の 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の初心者なので、明らかな解決策を無視しないでください...
よろしくお願いいたします。
男。