JavaアプレットとJava Web Startアプリケーションのデプロイに関連のある問題および解決方法についての説明。
この章の構成は、次のとおりです。
アプレットおよびJava Web Startアプリケーションの構成の問題を解決するためのトラブルシューティングの手法。
次の項では、様々な構成パラメータおよび設定に関する多くの問題について説明し、アプレットおよびJava Web Startアプリケーションの構成のトラブルシューティング手法を提案します。
Javaコントロール・パネル・ツールを使えば、インストール済みの一連のJava Runtime Environmentとその動作を管理できます。
Javaコントロール・パネルは、JREインストール・フォルダのbin
ディレクトリから起動できます。Windowsオペレーティング・システムの場合、「コントロール パネル」>「Java」からもアクセスできます。
次を行う必要がある場合にJavaコントロール・パネルを使用します。
インストール済のJREおよびアクティブなJREのバージョンを確認する
特定バージョンのJREの使用を一時的に有効または無効にする
アプレットまたはWeb Startアプリケーションの起動時にJVMに渡される「グローバル」パラメータを設定する
特定ブラウザでのJava Pluginの使用を有効または無効にする
プラグインまたはWeb Startアプリケーションの動作を調整するため、図16-1に示すように、構成パラメータを指定する(一時ファイルのキャッシュの場所、トレースの有効化など)
トラブルシューティング、デバッグ、プロファイリングなどの開発アクティビティでは、JVMの起動時に特別なパラメータ・セットを指定する必要がある場合があります。これを実現する方法の1つは、Javaコントロール・パネルを使用することです。
Javaコントロール・パネルを開き、「Java」タブの「表示」をクリックします。変更するJREの「ランタイム・パラメータ」セルを選択し、このセルにパラメータを入力します。
注意:
これらの変更はグローバルであり、このバージョンのJREを使用して実行されるJava Web Startアプリケーションまたはアプレットでは、appletタグやJNLPファイルでの指定に加えて、これらのパラメータが設定されます。
Java Web Startやアプレットで使用される特定のJVMにパラメータを渡すには、次のいずれかの手法を使用します。
これは、主な構成ファイルが保持されている場所です。この場所は、オペレーティング・システムに固有です。
Windows XP: %HOME%\Application Data\Sun\Java\Deployment
Windows 7/Vista: %APPDATA%\..\LocalLow\Sun\Java\Deployment
Oracle Solaris/Linux: %HOME%/.java/deployment
Java Plug-inとJava Web Startは両方とも、トレース情報をトレース・ファイルに出力できます。これにはJRE自体からのログ情報と、アプリケーションからSystem.out
またはSystem.err
に出力されるすべての情報が含まれます。
トレース情報にアクセスするには、次のようにします。
jre_home_dir/bin/ControlPanel
)を開きます。トレース・ファイルは、Javaデプロイメント・ホーム・フォルダの log
ディレクトリに保存されます。Javaデプロイメント・ホームを参照してください。ファイル名には、実行している対象によってjavaws
またはplugin
の接頭辞がつきます。プロセスにつき1つのトレース・ファイルが作成されますが、1つのアプリケーションは複数のプロセスを使用して起動できます。
トレース・ファイルの詳細レベルを最大にするには、deployment.properties
ファイル(Java配備ホーム・ディレクトリにあります)を編集して次の行を追加します。
deployment.trace.level=all
デフォルトでは、最大5つのトレース・ファイルが作成されます。もっとも古いトレース・ファイルが自動的に削除されます。トレース・ファイルの最大数の制限を変更するには、deployment.properties
ファイルに次の行を追加します。
deployment.max.output.files=max_number_of_trace_files
Javaコンソールを使用すると、実行中にトレース・ログを表示できます。デフォルトでは、Javaコンソールは非表示です。これをJavaコントロール・パネルで有効にしてください。
アプリケーションのJARとリソースは、次回必要になった際にロードしないで済むように、ディスク上にキャッシュされます。
キャッシュのデフォルトの場所はオペレーティング・システムに依存しますが、Javaコントロール・パネルでオーバーライドできます。
キャッシュの設定や制御は、Javaコントロール・パネルの「一般」タブの「インターネット一時ファイル」セクションで使用できます。キャッシュの場所やサイズを変更するには、「設定」をクリックします。キャッシュ内のファイルを表示するには、「表示」をクリックします。
キャッシュをクリーン・アップするには、javaws -uninstall
を実行するか、Javaコントロール・パネルの「一般」タブを開き、「表示」をクリックして、ファイルを手動で削除します。また、Javaコントロール・パネルを使って個々のアプリケーションや拡張をアンインストールすることもできます。
一般に、Java Web Startアプリケーションはデフォルトでシステムのネットワーク構成を使用し、アプレットはブラウザのネットワーク設定を使用します。Javaコントロール・パネルを使用すれば、ネットワーク・プロキシを明示的に設定できます。
特に、Javaテクノロジのネットワーク層は、使用する必要があるネットワーク・スタックを自動的に検出します。ただし、自動検出が動作しないときがあり、アプリケーションやアプレットをダウンロードするソケットを開こうとした際にアクセス権拒否(Permission Denied
)例外が発生することがあります(他のツールでは同じプロキシ設定を使用して同じURLにアクセスできる場合でも)。この問題は、一部のWindows 7システムでVPNソケットを使用した場合に発生しました。これを解決するには、JVMに明示的にパラメータを渡します。
-Djava.net.preferIPv4Stack=true
「JREへのパラメータの受渡し」を参照してください。
タブをサポートする最新のブラウザでは、各タブがそれぞれ独立したブラウザ・プロセスである可能性があります。Javaアプレットがブラウザ・ページに埋め込まれていて、次世代プラグインが使用されている場合、通常、そのブラウザ・タブに関連付けられたプロセスが、そのプロセスの内部にJVMを作成します(ブラウザVM)。このブラウザVMは、アプレットの実行やアプレットのライフ・サイクルの管理を行う、別のJVMプロセス(クライアントVM)を作成します。クライアントVMは1つのJavaプロセスです(Windowsではjava.exe
、Oracle Solaris/Linuxプラットフォームではjava
)。
次に、アプレットの問題およびトラブルシューティング手法を示します。
アプレットが起動しない場合は、前述したように、必ずトレースとJavaコンソールを有効にしてください。次に、次のヒントを使用してアプレットが動作しない理由を調べます。
トレース・ファイルが生成されたり、Javaコンソールが表示されたりしますか。
いいえ、トレース・ファイルを得られません
Javaテクノロジが検出されているかどうかを確認します。「検証」を参照してください。
検出されている場合
「ブラウザまたはJavaプロセスのクラッシュ」のJVMブラウザの問題を参照してください。
検出されていない場合
これはおそらく構成の問題です。「一般的な構成の問題」を参照し、それでもわからない場合は、「ブラウザまたはJavaプロセスのクラッシュ」のJVMブラウザの問題を参照してください。
はい、トレース・ファイルがあります
これは(次世代プラグインを無効にしていないかぎり)、おそらく構成の問題ではありません。この問題はおそらくこのアプレットに固有のものです。確認のため、ほかのアプレットもいくつか起動してみてください。「ブラウザまたはJavaプロセスのクラッシュ」のJVMクライアントの問題を参照してください。
クラッシュは、プラットフォームの問題かアプリケーションの問題によって発生する可能性があります。
通常、JVMでクラッシュが発生すると、現在の作業ディレクトリにhs_err_*log
ファイルが作成されます。Windowsでは、多くの場合デスクトップにあります。これは、スタンドアロン・アプリケーションと同じクラッシュ・レポート・ファイルです。「致命的エラー・ログ」を参照してください。
配備キャッシュ・ディレクトリからロードされたネイティブ・ライブラリが見つかった場合に、特にそれらのライブラリのコードがクラッシュ・スタックに含まれている場合は、アプリケーションのバグである可能性が非常に高くなります。
それ以外の場合は、JREのバグであり、バグ・データベースに報告する必要があります。
プラットフォームまたはアプリケーションの問題によるクラッシュの場合に考慮すべき2つのシナリオを次に示します。
JVMブラウザの問題: ブラウザ・プロセスで実行されているJVMの詳細を取得してください。ブラウザを起動する前に、次の2つの環境変数を設定します:
JPI_PLUGIN2_DEBUG=1 JPI_PLUGIN2_VERBOSE=1
Windowsの場合、ブラウザ・プロセスに関連付けられたコマンド・ウィンドウが存在するはずです。ブラウザVMのデバッグ出力はすべて、コマンド・ウィンドウに表示されます。そこに例外が表示されていないかチェックします。Javaスレッド・ダンプを取得するには、コマンド・ウィンドウで[Ctrl]+[Break]キー・シーケンスを使用します。
Oracle SolarisまたはLinuxプラットフォームの場合、これらの変数を設定した後、同じセッションからブラウザを起動します。ブラウザVMのデバッグ出力はすべて、端末ウィンドウに表示されます。Javaスレッド・ダンプを取得するには、別の端末からkill -3
pid
またはkill -SIGQUIT
pid
を使用します(pid
はブラウザ・プロセスのプロセスID)。
クライアントVMとブラウザVM間ではハートビート・メッセージが送信されます。このハートビート・メッセージをオフにするには、JPI_PLUGIN2_NO_HEARTBEAT
環境変数を1
に設定します。これは、問題がハートビート関連かどうかを区別するのに役立ちます。
ログが開かれず、ブラウザ・プロセス内で環境変数が設定されている場合、JREが正しくインストールされていないか、Javaが無効になっている可能性があります。どうしても解決できない場合は、構成エラーがないかチェックし、JREの再インストールを試みてください。
JVMクライアントの問題: 最新のトレース・ファイルをチェックしてヒントを得ます。
注意: 同じクライアントJVMを複数のアプレットで共有することができます。共有JVMで、使用可能なリソース(ヒープ・サイズなど)が不足したために、間欠的な失敗が発生する場合があります。この場合は、ページを再ロードすると問題が解決することがあります。
アプリケーションがメモリー不足(Out of memory
)エラーで失敗する場合は、ヒープ・サイズを増やす必要があります。これは、アプリケーション配備記述子(JNLPファイル)で行うことも、Javaコントロール・パネルで、使用するJREのランタイム・パラメータを使用して行うこともできます。
アプリケーションが署名付きであり、ユーザーがセキュリティ・ダイアログ・ボックスで拒否した場合、アプリケーションが失敗する可能性があります。ユーザーが行なった決定は、JVMが再起動するまで記憶されます。セキュリティ・ダイアログ・ボックスを再び表示させるには、ユーザーがブラウザを再起動する必要がある場合があります。
応答のないWebページが生じる可能性があるシナリオを次に示します。
アプレットの起動または実行時にアプレットがフリーズする:
アプレットの起動時または実行時にアプレットがフリーズする原因は、Liveconnectの呼出しである可能性があります。
起動時にJavaScriptからJavaアプレットにアクセスしようとすると、アプレットの初期化が完了するまでJavaScriptエンジンがブロックされる可能性があります。アプレットの準備が整うまでJavaScriptアクセスを延期し、enableStatusEvents
パラメータを使用してアプレット・ステータス・チェックへの非ブロック・アクセスのロックを解除することをお薦めします。
実行時にLiveConnectを使用するには、JavaScriptの呼出しをすばやく復帰させることで、シングル・スレッドのJavaScriptエンジンがブロックされないようにすることをお薦めします。
アプレットまたはブラウザがハングする:
この場合の最良の情報源は、クライアントJVMとブラウザJVMの両方のスタック状態です。
jstack
を使用してブラウザJVM (jstack browser-pid
を実行)とクライアントJVMのJVMスタック・ステータスを収集します。注意: これらのいずれかのVMのコンテキストでデッドロックが発生した場合、jstack
はデッドロックをハイライトできますが、デッドロックに両方のプロセスが含まれる場合にはこれを行うことができません。この場合、スレッド・スタックを手動で調べる必要があります。「jstackユーティリティ」を参照してください。
「プロセスのハングおよびループのトラブルシューティング」を参照してください。
Java Runtimeは、発生する可能性のあるセキュリティに関連する問題について、ユーザーに自動的に警告します。使用するアプリケーションが安全であると確信できる場合には、セキュリティ・ダイアログ・ボックスをバイパスしてユーザー体験を簡素化できます。
セキュリティ・ダイアログ・ボックスを回避する2つのシナリオを次に示します。
JavaアプレットまたはWeb Startアプリケーションが署名付きの場合、証明書セキュリティ警告ダイアログ・ボックスが表示されるので、「実行」をクリックしてアプリケーション・コードにすべての権限を与える必要があります。
このダイアログ・ボックスが表示されないようにするには、次のいずれかを実行します。
アプリケーションの署名に使用された証明書を受け入れ、「この発行者からのコンテンツを常に信頼」チェックボックスを選択します。これで、次回からこのアプリケーションに権限が自動的に付与されます(証明書が期限切れになるか、信頼できるキーストアから削除されるまで)。
証明書は、JREの信頼できる証明書ストアに手動でインポートできます。Javaコントロール・パネルを使用して証明書をインポートするには、「セキュリティ」タブで、「証明書」→「信頼できる証明書」をクリックします。証明書ストアへの証明書のインポートをコマンド行から行うには、keytool
ユーティリティ(JREのbin
フォルダ内)を使用します。
${user.home}/.java.policy
にあるJavaポリシー・ファイルでAllPermissions
を付与するか、$(JRE_HOME)/lib/security/java.security
ファイル内で、AllPermissions
を含む任意のJavaポリシー・ファイルをポイントします。権限は、すべてのアプリケーションに付与することも、特定のURLに制限することもできます。.java.policy
の詳細は、「デフォルトのPolicyの実装とポリシー・ファイルの構文」を参照してください。
注意:
自動的な権限付与が望ましくない場合は、Javaコントロール・パネルを使って信頼できる証明書キーストアから証明書を削除してください。これを行うと、セキュリティ・ダイアログ・ボックスが表示されます。
署名付きと署名なしのコンポーネントを含む署名付きのJava Web Startアプリケーションとアプレットは、混合コードがアプリケーション・ベンダーによって意図されたものでないかぎり、安全でない可能性があります。最新バージョンのJavaランタイムでは、署名付きコンポーネントと署名なしコンポーネントの両方がプログラムに含まれていて不審な使用が検出された場合には、混合コード警告ダイアログが表示されます。
通常、このダイアログ・ボックスを回避するには、アプリケーションの実装に変更を加えるか、アプリケーションを再パッケージングする必要があります。信頼できるコードと信頼できないコードの混在をソフトウェアで一切チェックしないようにすることも可能ですが、これによってユーザーは安全でない可能性のあるコードを警告も追加の保護もなく実行できるようになるためお薦めしません。
Java Web Startアプリケーションとアプレットでは、直接起動のかわりにアタッチ・メカニズムを使用する必要あることを除き、スタンドアロン・アプリケーションのデバッグおよびプロファイリングで利用できる手法のほとんどを使用できます。
注意:
プラグインとJava Web Startは、実際にアプリケーションまたはアプレットを実行するJVMを実行する追加のjava
またはjavaw
プロセスを生成します。アプレットに関する情報を収集できるように、これらのプロセスにアタッチする必要があります。たとえば、アプレットのメモリー・ダンプを取得するには、PluginMain
クラスを実行しているjava
プロセスのプロセスIDを調べる必要があります。たとえば、JDKからjpsユーティリティを使用した後、jmapユーティリティを使用してメモリー・ダンプを取得します。アプレットのデバッグのための開発のヒントを次に示します。