プライマリ・コンテンツに移動
Java Platform, Standard Editionトラブルシューティング・ガイド
リリース9
E90916-02
目次へ移動
目次

前
次

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

JavaアプレットとJava Web Startアプリケーションのデプロイに関連のある問題および解決方法についての説明。

この章の構成は、次のとおりです。

構成の問題

アプレットおよびJava Web Startアプリケーションの構成の問題を解決するためのトラブルシューティングの手法。

次の項では、様々な構成パラメータおよび設定に関する多くの問題について説明し、アプレットおよびJava Web Startアプリケーションの構成のトラブルシューティング手法を提案します。

検証

アプリケーションが動作しない場合の検証手法。

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

  1. Java Plug-inが動作していることを確認します。
    • 「Javaのバージョンの確認」に移動します。

    • Javaのバージョンの確認」をクリックします。

    • 画面上で予想どおりのJavaテクノロジ・バージョンが報告された場合、プラグインは有効で、検出されています。

  2. ブラウザがJavaプラグインを認識していることをチェックします
    • Chrome: アドレス・バーで「about: plugins」と入力します。

    • Firefox: 「ツール」メニューで、「アドオン」を選択して「プラグイン」をクリックします。

    • Internet Explorer: 「ツール」メニューで、「アドオンの管理」を選択します。

  3. Javaランタイム環境がインストールされていることを確認します

    Windowsの場合、コントロール・パネルでインストール済みプログラムの一覧をチェックします。

一般的な構成の問題

一般的な構成の問題を解決するためのトラブルシューティング手法。

次は、一般的な構成の問題のトラブルシューティング手法です。

  • Javaランタイムのインストール:
    Java Developer Kitをインストールするだけでは十分ではありません。アプレットまたはJava Startアプリケーションを実行するにはJREが必要です。

    注意:

    JREには64ビット・ブラウザが必要です。
  • 一致する最新のプラグイン/Web Startの使用:

    ブラウザに登録できるプラグインは1つだけであり、JREは常に、システム上の最新のJREに含まれるプラグインをアクティブとして登録します。古いプラグインが確実に使用されるようにするための唯一の方法は、新しいJREをアンインストールすることです。

  • Javaランタイム構成に変更を加えた場合のブラウザの再起動:

    Javaが有効になっていないか、Javaが複数の場所で無効化されている可能性があります。Javaコントロール・パネルと、ブラウザのプラグイン/アドオン・リストをチェックしてください。

  • 新しい世代のプラグインが有効であることの確認:

    レガシー・モードでの実行が必要でないかぎり、Javaコントロール・パネルで次世代のプラグインが有効になっていることを確認してください。

  • JavaScriptの有効化:

    JavaScriptが無効になっていると、Javaアプレットの起動の試みが非常に早い段階で失敗する可能性があります。

  • 前回使用時間トラッキングの無効化:
    JREは前回使用された時刻をトラッキングします。アプレットまたはJava Web Startアプリケーションに対して前回使用された時間、コマンド行や他の方法で起動された時間がファイルに記録されます。

    デフォルトでは、前回使用時間トラッキングが有効になります。前回使用時間トラッキングを無効にするには、Java Usage Trackerプロパティ・ファイルのJava Usage Trackerプロパティcom.oracle.usagetracker.track.last.usagefalseに設定します。詳細は、Java Platform, Standard Edition Usage TrackerガイドのJava Usage Trackerプロパティに関する項を参照してください。

    前回使用時間トラッキングを有効にすると、オペレーティング・システムに応じて、次のディレクトリのいずれかにファイルが作成されます。
    • Windows: %ProgramData%\Oracle\Java\.oracle_jre-usage\

    • 他のすべのオペレーティング・システム: ${user.home}/.oracle_jre_usage/

    注意:

    商用機能であるJava Usage Tracker、および商用機能ではない前回使用時間トラッキングは別々に有効になるため、1つを無効にしても、もう1つは無効になりません。

  • Javaコントロール・パネルでのJavaの設定への変更の失敗:

    UACがオンになっているWindows 7またはWindows Vistaシステムでは、Javaコントロール・パネルがグローバル・レジストリ設定の更新に失敗する可能性があります。これを回避するには、これらの設定を変更する必要がある場合に、必ずJavaコントロール・パネルを管理者として起動してください。

Javaランタイムの管理

Javaコントロール・パネル・ツールを使えば、インストール済みの一連のJava Runtime Environmentとその動作を管理できます。

Javaコントロール・パネルは、JREインストール・フォルダのbinディレクトリから起動できます。Windowsオペレーティング・システムの場合、「コントロール パネル」>「Java」からもアクセスできます。

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

  • インストール済のJREおよびアクティブなJREのバージョンを確認する

  • 特定バージョンのJREの使用を一時的に有効または無効にする

  • アプレットまたはWeb Startアプリケーションの起動時にJVMに渡される「グローバル」パラメータを設定する

  • 特定ブラウザでのJava Pluginの使用を有効または無効にする

  • プラグインまたはWeb Startアプリケーションの動作を調整するため、図16-1に示すように、構成パラメータを指定する(一時ファイルのキャッシュの場所、トレースの有効化など)

図16-1 「Java Runtime Environment設定」ウィンドウ

図16-1の説明が続きます
「図16-1 「Java Runtime Environment設定」ウィンドウ」の説明

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

トラブルシューティング、デバッグ、プロファイリングなどの開発アクティビティでは、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
    

Javaデプロイメント・ホーム

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

  • 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に出力されるすべての情報が含まれます。

トレース情報にアクセスするには、次のようにします。

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

トレース・ファイルは、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プロセスのクラッシュ

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

通常、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ページ

応答のない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ユーティリティを使用してメモリー・ダンプを取得します。

アプレットのデバッグのための開発のヒントを次に示します。

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

    スタンドアロンJavaアプリケーションの場合と同様に、アプレットまたはWeb Startアプリケーションのデバッグには、任意のJPDAベースのデバッガを使用できます。たとえば、「jdbユーティリティ」 またはNetBeansデバッガを参照してください。

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

    アプレットまたはJava Web Startアプリケーションを実行するJVMに引数を渡す方法の詳細は、「JREへのパラメータの受渡し」を参照してください。次に、コマンド行から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アプレットおよびJava Web Startアプリケーションのプロファイリング:

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

    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を使用したヒープ・ダンプの取得、jconsoleを使用したスレッドの監視、-XX:+HeapDumpOnOutOfMemoryErrorをJVMに渡して(「JREへのパラメータの受け渡し」を参照)エラー発生時にメモリー・ダンプの取得を実行します。jpsユーティリティを使用してアプリケーションを実行しているプロセスのプロセスIDを調べます。