この章では、Java アプリケーションの配備に関係するいくつかの問題や解決方法について説明します。
アプリケーションが実行されない場合は、次のチェックを実行してください。
Java Plug-in が動作していることを確認します。
ブラウザが Java Plug-in を認識していることをチェックします。
about: plugins
と入力します。Java Runtime Environment がインストールされていることを確認します。
Java コントロールパネルツールを使えば、インストール済みの一連の Java Runtime Environment とその動作を管理できます。Java コントロールパネルは、JRE インストールフォルダの bin
ディレクトリから起動できます。Windows オペレーティングシステムの場合、「コントロールパネル」 > 「Java」からもアクセスできます。
次を行う必要がある場合に Java コントロールパネルを使用します。
トラブルシューティング、デバッグ、プロファイリングなどの開発アクティビティーでは、JVM の起動時に特別なパラメータセットを指定しなければならない場合があります。これを実現する方法の 1 つは、Java コントロールパネルを使用することです。
Java コントロールパネルを開き、「Java」タブに移動してから「表示」ボタンをクリックします。変更する JRE の「ランタイムパラメータ」セルを選択し、このセルにパラメータを入力します。
これらの変更は「グローバル」です — このバージョンの JRE を使って実行されるすべての Java Web Start アプリケーションまたはアプレットで、(applet タグや JNLP ファイルで指定されたもののほかに) これらのパラメータが設定されます。
Java Web Start やアプレットで使用される特定の JVM にパラメータを渡すには、次のいずれかの手法を使用します。
javaws
またはブラウザのプロセスを起動する前に環境変数を設定します。
JAVAWS_VM_ARGS
(Java Web Start アプリケーション用)。例:
JAVAWS_VM_ARGS = -Dsome.property=true
_JPI_VM_OPTIONS
(アプレット用)。例:
_JPI_VM_OPTIONS = -Dsome.property=true
環境変数の設定が完了したら、ブラウザを再起動する必要があります。この環境変数をコマンドシェルで設定した場合は、環境変数の値がブラウザに継承されるように、同じコマンドシェルを使ってブラウザを起動する必要があります。
javaws
コマンドで -J
オプションを使用します。例:
javaws -J-Dsome.property=true http://example.com/my.jnlp
これは、主な構成ファイルが保持されている場所です。この場所は、オペレーティングシステムに固有です。
%HOME%\Application Data\Sun\Java\Deployment
%APPDATA%\..\LocalLow\Sun\Java\Deployment
%HOME%/.java/deployment
Java Plug-in と Java Web Start は両方とも、トレース情報をトレースファイルに出力できます。これには JRE 自体からのログ情報と、アプリケーションから System.out
または System.err
に出力されるすべての情報が含まれます。
トレース情報にアクセスするには、次の手順に従ってください。
<JRE directory>/bin/ControlPanel
) を開きます。トレースファイルは 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 コントロールパネルで有効にしてください。
アプリケーションの JAR とリソースは、次回必要になった際にロードしないで済むように、ディスク上にキャッシュされます。
キャッシュのデフォルトの場所はオペレーティングシステムに依存しますが、Java コントロールパネルでオーバーライドできます。
キャッシュの設定や制御は、Java コントロールパネルの「一般」タブの「インターネット一時ファイル」セクションで使用できます。キャッシュの場所やサイズを変更するには、「設定...」をクリックします。キャッシュ内のファイルを表示するには、「表示...」をクリックします。
キャッシュをクリーンアップするには、javaws -uninstall
を実行するか、Java コントロールパネルの「一般」タブに移動して「表示...」をクリックし、ファイルを手動で削除します。また、Java コントロールパネルを使って個々のアプリケーションや拡張をアンインストールすることもできます。
一般に、Java Web Start アプリケーションはデフォルトでシステムのネットワーク構成を使用し、アプレットはブラウザのネットワーク設定を使用します。Java コントロールパネルを使えば、ネットワークプロキシを明示的に設定できます。
特に、Java テクノロジのネットワーク層は、使用すべきネットワークスタックを自動的に検出します。ただし、自動検出が動作しないときがあり、アプリケーションやアプレットをダウンロードするソケットを開こうとした際に「アクセス権の拒否」例外が発生することがあります (一方、ほかのツールでは、同じプロキシ設定を使って同じ URL にアクセスできます)。この問題は、一部の Windows 7 システムで VPN ソケットを使用した場合に発生しました。これを解決するには、JVM に明示的にパラメータを渡します。
-Djava.net.preferIPv4Stack=true
詳細については、JVM にパラメータを渡す方法に関するセクションを参照してください。
タブをサポートする最新のブラウザでは、各タブがそれぞれ独立したブラウザプロセスである可能性があります。Java アプレットがブラウザページに埋め込まれていて、次世代プラグインが使用されている場合、通常、そのブラウザタブに関連付けられたプロセスが、そのプロセスの内部に JVM を作成します (ブラウザ VM)。このブラウザ VM が、アプレットの実行やアプレットのライフサイクルの管理を行う、別の JVM プロセス (クライアント VM) を作成します。クライアント VM は 1 つの Java プロセスです (Windows では java.exe
、Linux/Solaris プラットフォームでは java
)。
アプレットが起動しない場合は、前述したように、必ずトレースと Java コンソールを有効にしてください。その後、以下のヒントを参考にして、アプレットが動作しない理由を見つけてください。
さらなるアドバイスを得るには、以下の各セクションを参照してください。
クラッシュは、プラットフォームの問題かアプリケーションの問題によって発生する可能性があります。
通常、JVM でクラッシュが発生すると、現在の作業ディレクトリに hs_err_*log
ファイルが作成されるはずです (Windows の場合、これはしばしばデスクトップ上に配置されます)。これは、スタンドアロンアプリケーションと同じクラッシュレポートファイルです。それを読む場合は、付録 B を参照してください。
配備キャッシュディレクトリからロードされたネイティブライブラリが見つかった場合、特にそれらのライブラリのコードがクラッシュスタックに含まれている場合、アプリケーションのバグである可能性が非常に高くなります。
それ以外の場合は、JRE のバグであり、bugs.sun.com に報告する必要があります。
ブラウザプロセス内で実行されている 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 で、使用可能なリソース (ヒープサイズなど) が不足したために、間欠的な失敗が発生する場合があります。この場合は、ページを再ロードすると問題が解決することがあります。
アプリケーションがメモリー不足エラーで失敗する場合は、ヒープサイズを増やす必要があります。これは、アプリケーション配備記述子 (JNLP ファイル) で行うことも、Java コントロールパネルで、使用する JRE の「ランタイムパラメータ」を使って行うこともできます。
アプリケーションが署名付きであり、ユーザーがセキュリティーダイアログで拒否した場合、アプリケーションが失敗する可能性があります。ユーザーが行なった決定は、JVM が再起動するまで記憶されます。セキュリティーダイアログをふたたび表示させるには、ユーザーがブラウザを再起動する必要がある場合があります。
アプレットを配備する際には、ほかのアプレットの影響を受けるリスクを減らしたり、アプレットのニーズに合わせて実行環境を調整したりできます。JDK ドキュメントの「アプレット配備」を参照してください。特に、separate_jvm parameter
引数の使用を検討してください。
アプレットの起動時や実行時にページが固まったようになる場合、その原因は 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 向けのトラブルシューティングガイドの、「ハングアップまたはループしているプロセスのトラブルシューティング」を参照してください。
Java Runtime は、発生する可能性のあるセキュリティーに関連する問題について、ユーザーに自動的に警告します。使用するアプリケーションが安全であると確信できる場合には、セキュリティーダイアログをバイパスしてユーザー体験を単純化することができます。
Java アプレット/Web Start アプリケーションが署名付きの場合、証明書セキュリティー警告ダイアログボックスが表示されるので、「実行」ボタンをクリックしてアプリケーションコードにすべての権限を与える必要があります。
このダイアログが表示されないようにするには、次のいずれかを行います。
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
を使ってメモリーダンプを取得します。
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 上で接続してくるのを待つように指示されています。呼び出しオプションの完全な説明については、このガイドを参照してください。
スタンドアロンの 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
プロセスに接続できます。使用すべきエージェントやその構成方法に関する具体的な詳細については、プロファイラのドキュメントを参照してください。
スタンドアロンアプリケーションで使用可能な任意の手法を、アプレットやアプリケーションを実行するプロセスで使用してください。たとえば、jmap
を使ってヒープダンプを取得したり、VisualVM や jconsole
を使ってスレッドを監視したり、-XX:+HeapDumpOnOutOfMemoryError
を JVM に渡して (「JRE へのパラメータの受け渡し」を参照) エラー時にメモリーダンプを取得したりします。jps
ユーティリティーを使ってアプリケーションを実行しているプロセスのプロセス ID を調べます。