印刷ビューの終了

Java SE 7 デスクトップテクノロジのトラブルシューティングガイド

印刷ビュー

ドキュメント情報

はじめに

1. はじめに

2. AWT

3. Java 2D

4. Swing

5. 国際化

6. Java Sound

7. アプレットと Java Web Start アプリケーション

7.1 構成の問題

7.1.1 検証

7.1.2 一般的な構成の問題

7.1.3 Java Runtime の管理

7.1.4 JRE へのパラメータの受け渡し

7.1.5 Java 配備のホーム

7.1.6 配備トレース情報

7.1.7 配備キャッシュ

7.1.8 ネットワーク構成

7.2 アプレットのトラブルシューティング

7.2.1 アプレットが起動しない - プラグインのチートシート

7.2.2 応答しない Web ページ

7.3 セキュリティーダイアログの回避

7.3.1 署名付きのアプリケーション

7.3.2 混在コードの問題

7.4 開発のヒント

7.4.1 アプレットおよび Web Start アプリケーションのデバッグ

7.4.2 アプレットおよび Java Web Start アプリケーションのプロファイリング

7.4.3 メモリーリークのデバッグ

8. バグレポートの送信

A. Java 2D のプロパティー

B. 致命的エラーログ

第 7 章

アプレットと Java Web Start アプリケーション

この章では、Java アプリケーションの配備に関係するいくつかの問題や解決方法について説明します。

7.1 構成の問題

7.1.1 検証

アプリケーションが実行されない場合は、次のチェックを実行してください。

Java Plug-in が動作していることを確認します。

  1. http://java.com/ja/download/installed.jsp にアクセスします。
  2. Java のバージョンの確認」ボタンをクリックします。
  3. 画面上で予想どおりの Java テクノロジバージョンが報告された場合、プラグインは有効で、検出されています。

ブラウザが Java Plug-in を認識していることをチェックします。

Java Runtime Environment がインストールされていることを確認します。

7.1.2 一般的な構成の問題

Java Runtime がインストールされていません。
Java Developer Kit をインストールするだけでは十分ではありません。アプレットや Web Start を実行できるようにするには JRE が必要です。64 ビットブラウザを使用する場合は、64 ビットバージョンの JRE が必要です。同様に、32 ビットブラウザの場合は 32 ビットの JRE が必要です。
一致する最新のプラグイン/Web Start が常に使用されます。
ブラウザに登録できるプラグインは 1 つだけであり、JRE は常に、システム上の最新の JRE に含まれるプラグインをアクティブとして登録します。古いプラグインが確実に使用されるようにするための唯一の方法は、新しい JRE をアンインストールすることです。
Java Runtime の構成を少しでも変更した場合には、ブラウザを再起動する必要があります
Java が有効ではありません。
Java が無効にされる可能性のある場所は複数あります。Java コントロールパネルと、ブラウザのプラグイン/アドオンリストをチェックしてください。
次世代のプラグインが有効になっていることを確認します。
レガシーモードでの実行が必要でないかぎり、Java コントロールパネルで「次世代のプラグイン」が有効になっていることを確認してください。
Java コントロールパネルが Java 構成での変更に失敗します。
UAC がオンになっている Windows 7 または Windows Vista システムでは、Java コントロールパネルがグローバルレジストリ設定の更新に失敗する可能性があります。これを回避するには、これらの設定を変更する必要がある場合に、必ず Java コントロールパネルを管理者として起動してください。
JavaScript を有効にする必要があります。
JavaScript が無効になっていると、Java アプレットの起動の試みが非常に早い段階で失敗する可能性があります。

7.1.3 Java Runtime の管理

Java コントロールパネルツールを使えば、インストール済みの一連の Java Runtime Environment とその動作を管理できます。Java コントロールパネルは、JRE インストールフォルダの bin ディレクトリから起動できます。Windows オペレーティングシステムの場合、「コントロールパネル」 > 「Java」からもアクセスできます。

次を行う必要がある場合に Java コントロールパネルを使用します。

Java コントロールパネルから使用可能な JRE リスト

7.1.4 JRE へのパラメータの受け渡し

トラブルシューティング、デバッグ、プロファイリングなどの開発アクティビティーでは、JVM の起動時に特別なパラメータセットを指定しなければならない場合があります。これを実現する方法の 1 つは、Java コントロールパネルを使用することです。

Java コントロールパネルを開き、「Java」タブに移動してから「表示」ボタンをクリックします。変更する JRE の「ランタイムパラメータ」セルを選択し、このセルにパラメータを入力します。

これらの変更は「グローバル」です — このバージョンの JRE を使って実行されるすべての Java Web Start アプリケーションまたはアプレットで、(applet タグや JNLP ファイルで指定されたもののほかに) これらのパラメータが設定されます。

Java Web Start やアプレットで使用される特定の JVM にパラメータを渡すには、次のいずれかの手法を使用します。

7.1.5 Java 配備のホーム

これは、主な構成ファイルが保持されている場所です。この場所は、オペレーティングシステムに固有です。

7.1.6 配備トレース情報

Java Plug-in と Java Web Start は両方とも、トレース情報をトレースファイルに出力できます。これには JRE 自体からのログ情報と、アプリケーションから System.out または System.err に出力されるすべての情報が含まれます。

トレース情報にアクセスするには、次の手順に従ってください。

  1. 「Java コントロールパネル」(<JRE directory>/bin/ControlPanel) を開きます。
  2. 「詳細」タブを選択します。
  3. 「デバッグ」カテゴリで、「トレースを有効にする」チェックボックスをチェックします。
  4. オプションとして、「Java コンソール」カテゴリで「コンソールを表示する」ラジオボタンを選択すると、トレース情報がコンソールウィンドウに表示されます。それでもファイルには完全なトレースが保存されます。

トレースファイルは Java 配備ホームディレクトリ (前のセクションを参照) 内のログディレクトリに保存されます。ファイル名には、実行している対象によって javaws または plugin の接頭辞がつきます。プロセスにつき 1 つのトレースファイルが作成されますが、1 つのアプリケーションは複数のプロセスを使用して起動できます。

トレースファイルの詳細レベルを最大にするには、deployment.properties ファイル (Java 配備ホームディレクトリにあります) を編集して次の行を追加します。

deployment.trace.level=all

デフォルトでは、最大 5 つのトレースファイルが作成されます。もっとも古いトレースファイルが自動的に削除されます。このトレースファイルの最大数の制限を変更するには、deployment.properties ファイルに次の行を追加します。

deployment.max.output.files=<maximum number of trace files>

Java コンソールを使用すると、実行中にトレースログを表示できます。デフォルトでは、Java コンソールは非表示です。これを Java コントロールパネルで有効にしてください。

7.1.7 配備キャッシュ

アプリケーションの JAR とリソースは、次回必要になった際にロードしないで済むように、ディスク上にキャッシュされます。

キャッシュのデフォルトの場所はオペレーティングシステムに依存しますが、Java コントロールパネルでオーバーライドできます。

キャッシュの設定や制御は、Java コントロールパネルの「一般」タブの「インターネット一時ファイル」セクションで使用できます。キャッシュの場所やサイズを変更するには、「設定...」をクリックします。キャッシュ内のファイルを表示するには、「表示...」をクリックします。

キャッシュをクリーンアップするには、javaws -uninstall を実行するか、Java コントロールパネルの「一般」タブに移動して「表示...」をクリックし、ファイルを手動で削除します。また、Java コントロールパネルを使って個々のアプリケーションや拡張をアンインストールすることもできます。

7.1.8 ネットワーク構成

一般に、Java Web Start アプリケーションはデフォルトでシステムのネットワーク構成を使用し、アプレットはブラウザのネットワーク設定を使用します。Java コントロールパネルを使えば、ネットワークプロキシを明示的に設定できます。

特に、Java テクノロジのネットワーク層は、使用すべきネットワークスタックを自動的に検出します。ただし、自動検出が動作しないときがあり、アプリケーションやアプレットをダウンロードするソケットを開こうとした際に「アクセス権の拒否」例外が発生することがあります (一方、ほかのツールでは、同じプロキシ設定を使って同じ URL にアクセスできます)。この問題は、一部の Windows 7 システムで VPN ソケットを使用した場合に発生しました。これを解決するには、JVM に明示的にパラメータを渡します。

-Djava.net.preferIPv4Stack=true

詳細については、JVM にパラメータを渡す方法に関するセクションを参照してください。

7.2 アプレットのトラブルシューティング

タブをサポートする最新のブラウザでは、各タブがそれぞれ独立したブラウザプロセスである可能性があります。Java アプレットがブラウザページに埋め込まれていて、次世代プラグインが使用されている場合、通常、そのブラウザタブに関連付けられたプロセスが、そのプロセスの内部に JVM を作成します (ブラウザ VM)。このブラウザ VM が、アプレットの実行やアプレットのライフサイクルの管理を行う、別の JVM プロセス (クライアント VM) を作成します。クライアント VM は 1 つの Java プロセスです (Windows では java.exe、Linux/Solaris プラットフォームでは java)。

7.2.1 アプレットが起動しない - プラグインのチートシート

アプレットが起動しない場合は、前述したように、必ずトレースと Java コンソールを有効にしてください。その後、以下のヒントを参考にして、アプレットが動作しない理由を見つけてください。

さらなるアドバイスを得るには、以下の各セクションを参照してください。

ブラウザまたは Java プロセスのクラッシュ

クラッシュは、プラットフォームの問題かアプリケーションの問題によって発生する可能性があります。

通常、JVM でクラッシュが発生すると、現在の作業ディレクトリに hs_err_*log ファイルが作成されるはずです (Windows の場合、これはしばしばデスクトップ上に配置されます)。これは、スタンドアロンアプリケーションと同じクラッシュレポートファイルです。それを読む場合は、付録 B を参照してください。

配備キャッシュディレクトリからロードされたネイティブライブラリが見つかった場合、特にそれらのライブラリのコードがクラッシュスタックに含まれている場合、アプリケーションのバグである可能性が非常に高くなります。

それ以外の場合は、JRE のバグであり、bugs.sun.com に報告する必要があります。

ブラウザ JVM のトラブルシューティング

ブラウザプロセス内で実行されている JVM に関する詳細情報を取得するには、ブラウザを起動する前に次の 2 つの環境変数を設定します。

JPI_PLUGIN2_DEBUG=1
JPI_PLUGIN2_VERBOSE=1

Windows の場合、ブラウザプロセスに関連付けられたコマンドウィンドウが存在するはずです。ブラウザ VM のデバッグ出力はすべて、コマンドウィンドウに表示されます。そこに例外が表示されていないかチェックします。Java スレッドダンプを取得するには、コマンドウィンドウで「Ctrl + Break」キーシーケンスを使用します。

Linux および Solaris プラットフォームの場合、上の変数を設定したあと、同じセッションからブラウザを起動します。ブラウザ VM のデバッグ出力はすべて、端末ウィンドウに表示されます。Java スレッドダンプを取得するには、別の端末から kill -3 pid または kill -SIGQUIT pid を使用します (pid はブラウザプロセスのプロセス ID)。

クライアント VM とブラウザ VM 間では「ハートビート」メッセージが送信されます。この「ハートビート」メッセージをオフにするには、JPI_PLUGIN2_NO_HEARTBEAT 環境変数を 1 に設定します。これは、問題が「ハートビート」関連かどうかを区別するのに役立ちます。

ログが開かれず、ブラウザプロセス内で環境変数が設定されている場合、JRE が正しくインストールされていないか、Java が無効になっている可能性があります。ほかに何をやっても解決できない場合は、構成エラーがないかチェックし、JRE の再インストールを試みてください。

クライアント JVM のトラブルシューティング

アイデアを得るために最新のトレースファイルをチェックします。

同じクライアント JVM が複数のアプレット間で共有されることがあります。共有 JVM で、使用可能なリソース (ヒープサイズなど) が不足したために、間欠的な失敗が発生する場合があります。この場合は、ページを再ロードすると問題が解決することがあります。

アプリケーションがメモリー不足エラーで失敗する場合は、ヒープサイズを増やす必要があります。これは、アプリケーション配備記述子 (JNLP ファイル) で行うことも、Java コントロールパネルで、使用する JRE の「ランタイムパラメータ」を使って行うこともできます。

アプリケーションが署名付きであり、ユーザーがセキュリティーダイアログで拒否した場合、アプリケーションが失敗する可能性があります。ユーザーが行なった決定は、JVM が再起動するまで記憶されます。セキュリティーダイアログをふたたび表示させるには、ユーザーがブラウザを再起動する必要がある場合があります。

アプレットを配備する際には、ほかのアプレットの影響を受けるリスクを減らしたり、アプレットのニーズに合わせて実行環境を調整したりできます。JDK ドキュメントの「アプレット配備」を参照してください。特に、separate_jvm parameter 引数の使用を検討してください。

7.2.2 応答しない Web ページ

アプレットの起動時や実行時にページが固まったようになる場合、その原因は LiveConnect 呼び出しである可能性があります。

起動時に JavaScript から Java アプレットにアクセスしようとすると、アプレットの初期化が完了するまで JavaScript エンジンがブロックされる可能性があります。アプレットの準備が整うまで JavaScript アクセスを延期し、enableStatusEvents パラメータを使ってアプレットステータスチェックへの非ブロックアクセスのロックを解除することをお勧めします。詳細や例については、「アプレットのステータスとイベントハンドラ」を参照してください。

実行時に LiveConnect を使用するには、JavaScript の呼び出しをすばやく復帰させることで、シングルスレッドの JavaScript エンジンがブロックされないようにすることをお勧めします。

アプレットまたはブラウザがハングアップする

この場合の最良の情報源は、クライアント JVM とブラウザ JVM の両方のスタック状態です。

jstack ユーティリティーを使ってブラウザ JVM (jstack browser-pid を実行) とクライアント JVM の JVM スタックステータスを収集します。これらのいずれかの VM のコンテキストでデッドロックが発生した場合に jstack はそれを強調する可能性がありますが、デッドロックに両方のプロセスが関与している場合は、それを行うことができません。この場合、スレッドスタックを手動で調べる必要があります。

ほかのアプローチについては、HotSpot VM に関する Java SE 7 向けのトラブルシューティングガイドの、「ハングアップまたはループしているプロセスのトラブルシューティング」を参照してください。

7.3 セキュリティーダイアログの回避

Java Runtime は、発生する可能性のあるセキュリティーに関連する問題について、ユーザーに自動的に警告します。使用するアプリケーションが安全であると確信できる場合には、セキュリティーダイアログをバイパスしてユーザー体験を単純化することができます。

7.3.1 署名付きのアプリケーション

Java アプレット/Web Start アプリケーションが署名付きの場合、証明書セキュリティー警告ダイアログボックスが表示されるので、「実行」ボタンをクリックしてアプリケーションコードにすべての権限を与える必要があります。

このダイアログが表示されないようにするには、次のいずれかを行います。

  1. アプリケーションの署名に使用された証明書を受け入れ、「この発行者からのコンテンツを常に信頼」チェックボックスを選択します。これで、次回からこのアプリケーションに権限が自動的に付与されます (証明書が期限切れになるか、信頼できるキーストアから削除されるまで)。
  2. 証明書は、JRE の信頼できる証明書ストアに手動でインポートできます。Java コントロールパネルを使って証明書をインポートするには、「セキュリティー」タブを選択し、「証明書」 > 「信頼できる証明書」を選択します。証明書ストアへの証明書のインポートをコマンド行から行うには、keytool ユーティリティー (JRE の bin フォルダ内) を使用します。
  3. ${user.home}/.java.policy にある Java ポリシーファイルで AllPermissions を付与するか、$(JRE_HOME)/lib/security/java.security ファイル内で、AllPermissions を含む任意の Java ポリシーファイルをポイントするようにします。権限は、すべてのアプリケーションに付与することも、特定の URL に制限することもできます。.java.policy の詳細については、「デフォルトの Policy の実装とポリシーファイルの構文」を参照してください。

注:自動的な権限付与が望ましくない場合には、Java コントロールパネルを使って信頼できる証明書キーストアから証明書を削除できます。これを行うと、以降は、セキュリティーダイアログボックスがふたたび表示されるようになります。

7.3.2 混在コードの問題

署名付きと署名なしのコンポーネントを含む署名付きの Java Web Start アプリケーションとアプレットは、混合コードがアプリケーションベンダーによって意図されたものでないかぎり、安全でない可能性があります。最新バージョンの Java ランタイムでは、署名付きコンポーネントと署名なしコンポーネントの両方がプログラムに含まれていて不審な使用が検出された場合には、混在コード警告ダイアログが表示されます。

このダイアログをバイパスするには一般に、アプリケーション実装の変更やアプリケーションの再パッケージングが必要です。信頼できるコードと信頼できないコードの混在をソフトウェアがまったくチェックしないようにすることも可能ですが、それはお勧めできません。安全でない可能性のあるコードを何の警告も追加の保護もなしにユーザーが実行できるようになるからです。混在コードの詳細やこのセキュリティー警告ダイアログボックスをバイパスする方法については、「アプリケーションとアプレットのセキュリティーを確保しながら署名付きコードと署名なしコードを混合させる」を参照してください。

7.4 開発のヒント

Java Web Start アプリケーションとアプレットでは、スタンドアロンアプリケーションのデバッグやプロファイリングに使用可能な手法の大部分を使用できますが、直接起動の代わりに「接続」メカニズムを使用しなければいけない点だけが異なります。

プラグインと Java Web Start はどちらも、アプリケーションやアプレットを実行する JVM を実際に実行する追加の java または javaw プロセスを生成します。アプリケーションに関する情報を収集できるようにするには、それらのプロセスに接続する必要があります。たとえば、アプレットのメモリーダンプを取得するには、まず PluginMain クラスを実行している java プロセスのプロセス ID を調べる必要があります。たとえば、JDK に含まれる jps ユーティリティーを使用したあと、jmap を使ってメモリーダンプを取得します。

7.4.1 アプレットおよび Web Start アプリケーションのデバッグ

jdb や NetBeans デバッガなど、任意の JPDA ベースのデバッガを使えば、スタンドアロン Java アプリケーションの場合と同様に、アプレットや Web Start アプリケーションをデバッグできます。

アプリケーションを実行する JVM で JDWP エージェントを有効にし、ポート番号を指定する必要があります。JVM が起動されたら、任意の IDE やツールを使ってその JVM に接続できます。

アプレットや Java Web Start アプリケーションを実行する JVM に引数を渡す方法の詳細については、セクション 7.1.4 を参照してください。たとえば、コマンド行から Java Web Start アプリケーションに詳細情報を渡す方法を次に示します。

bash$ javaws -J-agentlib:jdwp=transport=dt_socket,address=4000,server=y,suspend=y http://acme.com/my/webstart.jnlp

ここではエージェントが、JVM の初期化後に一時停止し、デバッガがポート 4000 上で接続してくるのを待つように指示されています。呼び出しオプションの完全な説明については、このガイドを参照してください。

7.4.2 アプレットおよび Java Web Start アプリケーションのプロファイリング

スタンドアロンの Java アプリケーションをプロファイリングするときに、任意の IDE はおそらく、JVMTI エージェントを使ってプログラムの実行に関する詳細情報を収集します。アプレットや Java Web Start アプリケーションでも同じことを行えますが、それには、-agentpath オプションを JVM に渡して JVMTI エージェントを明示的に構成する必要がある場合があります。JVM にオプションを渡す方法の詳細については、セクション 7.1.4 を参照してください。

次に例を示します。

set _JPI_VM_OPTIONS="-agentpath:C:\Tools\NetBeans\profiler\lib\deployed\jdk16\windows\profilerinterface.dll=C:\Tools\NetBeans\profiler\lib,5140"

次にブラウザを起動します。このブラウザセッションで実行されるすべてのアプレットで、NetBeans プロファイルエージェントが有効になります。NetBeans IDE を使って java プロセスに接続できます。使用すべきエージェントやその構成方法に関する具体的な詳細については、プロファイラのドキュメントを参照してください。

7.4.3 メモリーリークのデバッグ

スタンドアロンアプリケーションで使用可能な任意の手法を、アプレットやアプリケーションを実行するプロセスで使用してください。たとえば、jmap を使ってヒープダンプを取得したり、VisualVM や jconsole を使ってスレッドを監視したり、-XX:+HeapDumpOnOutOfMemoryError を JVM に渡して (「JRE へのパラメータの受け渡し」を参照) エラー時にメモリーダンプを取得したりします。jps ユーティリティーを使ってアプリケーションを実行しているプロセスのプロセス ID を調べます。