よくある質問(全般)

その他のセクションも役に立ちますので是非ご覧ください:

質問

回答

Windows サービスとして動かしている時、自分のアプリケーションがネットワークドライブにアクセスできません。

デフォルトでは、SYSTEM ユーザーとして Windows サービスを動作させます。 この「ネットワークドライブにアクセスできない」問題の原因は、SYSTEM ユーザーは、ネットワークリソースにアクセス権がないからです。 もし、アプリケーションが Windows サービスとして正常に動作しているならば、 まず最初に試してみることは、コンソールアプリケーションとして正常に動作する時と 同じユーザーでログインして、サービスを動かしてみることです。

その手順を説明すると、

  • まず始めに、もし現在、Windows サービスとして動作している場合には、そのアプリケーションをアンインストールしてください。
  • その後、「wrapper.conf」 ファイルをエディタで開き、[wrapper.ntservice.account]プロパティと [wrapper.ntservice.password] プロパティを設定してください。
  • その後、再インストールしてサービスとして動作させます。

そうすると、サービスはコンソールアプリケーションとして動作しているのと同じ環境で動いていますので、 全てが問題なく正しく動作するはずです。

セキュリティ要件に応じて、特にこのサービス用に、新しいユーザーを作成および設定をすることもできます。

一部のシステム上では、システムの再起動時に、 本当のユーザーが実際にログインして、そのドライブへ接続するまで、 ドライブレター(ドライブを示すアルファベット)を割り当てられたドライブが、 常にアクセス可能というわけではないようです。 この問題の回避手段としては、割り当てられたドライブレターではなく、 ドライブを直接的に参照する UNC 形式(マシン名を含むフルパス)を使うことです。

設定例:UNC 形式(マシン名を含むフルパス)
//host/share/path

スレッドダンプを要求すると、JVM が予想外に終了します。

[CTRL]+[BREAK][CTRL]+[\]のキー操作、あるいは、API 経由でスレッドダンプを要求すると、ログに次のようなメッセージが表示され、JVM が再起動します:

ログメッセージ:
wrapper  | JVM exited unexpectedly.

まず、JVM を起動する際に、[-Xrs フラグ] を指定していないことを確認してください。 このフラグは、Wrapper を使わずに Java を動かす環境では便利ですが、Wrapper の様々なシステムシグナルに応答できる能力を損ないます。

Wrapper の設定で、 JVM がシステムシグナルを無視するには、 代わりに[wrapper.ignore_signals] プロパティをご利用ください。 設定を変更する際には、必ず事前に説明を読んでください。

自分のアプリケーションは、Windows COM API を利用していますが、Wrapper で動作しません。

Wrapper で COM アプリケーションを動かそうとすると、問題が起きるという報告も数例あがっています。 アプリケーションがスタンドアローンとして単独で正常に動作する場合でも、Wrapper で動かそうとすると、次のようなエラーが出る場合があります:

エラーメッセージ:
Caught java.lang.NullPointerException: name can't be null while loading driver com.sun.comm.Win32Driver

「COM API」 には2つのファイルを有効にする必要があります: ライブラリーパスの「win32com.dll」 ファイルと、[system.getProperty("java.home")] によって返されるディレクトリーの サブディレクトリー 「lib」 に配置された 「javax.comm.properties」 プロパティファイルです。

自分の 「wrapper.conf」 ファイルが [JAVA_HOME] 環境変数によって指定されているものとは異なる JVM を使うように設定されている場合、 このような問題が発生します。 自分の 「wrapper.conf」 ファイルに下記のように [wrapper.java.command] プロパティで正しく設定されてた JVM を利用していることを確認してください。

「wrapper.conf」 ファイル設定例:
wrapper.java.command=%JAVA_HOME%/bin/java

Wrapper でアプリケーションを動かすと、セキュリティ例外が発生します。

Wrapper の導入前と導入後(インテグレーション後)の Java アプリケーションの動作環境で唯一の違いは、前にはスタートアップ時に JVM によって直接的にアプリケーションのメインメソッドが呼び出されていたことです。 今、[WrapperSimpleApp]ヘルパークラス、あるいは [WrapperStartStopApp]ヘルパークラスを 利用していると想定すると、 JVM は、まず始めにクラスのメインメソッドを呼び出し、その後 Wrapper が初期化してから アプリケーションのメインメソッドを呼び出します。

これは、セキュリティマネージャーを利用している際に、問題を引き起こすことがあります。 その理由は、Java セキュリティマネージャーがコールスタックを検索して、アクセスを認める前に、各クラスやメソッドに保護されたコードを呼び出す権利が与えられてることを確認しているためです。 Wrapper のクラスがコールスタックを終了して特権を与えられていないと、 セキュリティ例外を受けることになります。

ポリシーファイルに以下のように 「wrapper.jar」 にパーミッション(アクセス権限)を追加してみてください。 通常であれば、この種の問題は改善されるはずです。

ポリシーファイル設定例:
// Give Wrapper classes full permissions
grant codeBase "file:../lib/wrapper.jar" {
    permission java.security.AllPermission;
};

Windows 上でユーザーがログアウトすると JVM が終了してしまう問題を、Wrapper はどのように取り扱いますか?

一部の Java サービスアプリケーションでは、 「Windows上でユーザーがログアウトすると、Java プロセスを終了してしまう」 という問題がたまにあります。 Wrapper は、初代リリースの時点からこの問題に影響されることなく、適切に対処しています。

Wrapper の Java 側は、これを正しく動かすために、ネイティブライブラリー(Windows:「wrapper.dll」、Linux/UNIX:「libwrapper.so」)を必要としています。 ネイティブライブラリーは、JVM プロセスへ送信される全てのシステムシグナルをトラップし、それらを正しく取り扱う、完全遂行を担っています。 Java アプリケーションによっては、 [WrapperListener] インターフェイスの [controlEvent] メソッドを実装することで、これらのシグナルの取り扱いを可能にする場合もあります。

ユーザーのログオフ時に、Wrapper によって JVM が再起動されるという問題に悩んでいる場合、 ライブラリーがロード(読み込み)されていることを確認してください。 もしロード(読み込み)されていない場合、WrapperManager の初期化中に、警告メッセージが JVM 出力に表示されます。

Wrapper がコンソールアプリケーションとして、またはサービスとして動作している間に、 ユーザーがログアウトすると何が起きるかの例は、ドキュメンテーションのTestWrapper サンプルアプリケーションセクションを参照ください。

システム上で自分のアプリケーション動作の優先度を変更するには、どうすればいいですか?

Windows システムの場合、「wrapper.conf」 ファイル の [wrapper.ntservice.process_priority] プロパティ を設定することで優先度を設定できます。 詳しくは、コンフィギュレーションの概要 をご覧ください。

UNIX システムの場合、優先度設定のおススメの方法は、Wrapper 起動時に、 ご自分のシェルスクリプトにある 「nice」 コマンドを使うことです。 Wrapper に同梱されているスクリプト例では、どのようにすればいいかを説明しています。 「nice」の使い方についての詳細は、 「man nice」 あるいは、「info nice」 をご覧ください。

自分のアプリケーションのユーザーディレクトリーを変更するには、どうすればいいですか?

デフォルトでは、Wrapper は JVM のユーザーディレクトリーを、 Windows の 「wrapper.exe」 ファイルのある場所、または UNIX システムの「Wrapper シェルスクリプト」のある場所に設定します。 これにより、アプリケーション内で確実に相対パスを使えるようにします。 ユーザーディレクトリーは JVM が起動する場所に依存するため、通常は可能ではありません。

相対パスを利用することで、いかなるディレクトリー内へでもアプリケーションを解凍し、 確実に動かすことができるので、非常に簡単にアプリケーションをインストールできるようになります。

デフォルト以外の場所にユーザーディレクトリーを設置する必要があるケースもあります。 その場合には、 [wrapper.working.dir] プロパティを設定することで変更が可能です。

注意

重要 - 余計なことで頭を悩ます無駄な時間を削減するためにも、変更操作に入る前に [作業ディレクトリー] のプロパティ説明を十分に読んでください。

自分は複数の Wrapper や JVM を動かしています。Windows タスクマネージャーで、どれがどれなのか、分かるようにするには?

Windows で複数の Wrapper を動かしている時、タスクマネージャーには、 全て 「wrapper.exe」 や 「java.exe」 と表示されているため、 どれがどのアプリケーションなのか識別するのは困難です。 Windows セキュリティ上の理由から、Wrapper に表示名を変更する機能を実装することは不可能です。

この回避策として、ややハッキングっぽい手荒な方法ですが、効果的です。

  • wrapper.exe」 ファイル名を 「wrapper-myapp.exe」に変更します。
  • その後、バッチファイルを変更して、この新しい「wrapper-myapp.exe」を利用できるように設定します。
  • Javaプロセスにも、同じように手を加える必要があります。 「%JAVA_HOME%/bin」ディレクトリーへ行き、「java.exe」を複製して「java-myapp.exe」を作成します。
  • その後、「wrapper.conf」ファイルを変更して、この新しい「java-myapp.exe」を利用するように設定します。 この新しい「java-myapp.exe」を利用できるように設定します。

Windows タスクマネージャーを見ると、どの実行ファイルが動作しているのか、 簡単に確認することができます。

wrapper.conf」ファイルで、[wrapper.pidfile] プロパティや、 [wrapper.java.pidfile] プロパティを設定することもできます。 そうすると、pid を含むファイルが作成されます。 これらの pid は、タスクマネージャに表示されている pid と比較することができます。 プロセス pid を表示するように、タスクマネージャーの設定を変更する必要がありますので ご注意ください。

特定のユーザーとして Wrapper を動かすには?

Windows 上では、[wrapper.ntservice.account] プロパティを設定することで、特定のユーザーとして Wrapper を動かすことができます。 その説明を熟読してからサービスを再インストールしてください。

UNIX 上では、Wrapper シェルスクリプト 「src/bin/App.sh.in」(Wrapper の旧バージョンのファイル名:「sh.script.in」)で「RUN_AS_USER」変数を設定します。 [console] コマンドで動作中には、Wrapper はカレントユーザーとして動作しますが、[start] コマンドで動かす場合、指定されたユーザーへ変更してから Wrapper を起動します。 つまり、カレントユーザーは「ユーザー変更」の権限を持っている必要があります。

VisualVM で Windows サービスとして動作している Java アプリケーションを、どのようにモニタリング(監視)できますか?

もし、Java アプリケーションが Windows サービスとして動作しているならば、 それは実際には VisualVM を起動しているユーザーと同じコンテキスト/セッションで動作していません。 従って、デフォルトで、VisualVM は Java アプリケーションを見つけることができません。

Windows XP までは、Windows サービス用のゆるいセキュリティポリシーによって、 次のステップのように、かなり簡単に解決を可能にしていました:

JVM が開始している時点で、JVM はそのプロセスとフック情報を環境変数 「%TMP%」 で指定された配置場所へを書き込んでいます。 一部の(こちらを含む)環境変数が各ユーザー用に別々に定義されていることを念頭に置いておいてください。 そのため、2つのプロセス(自分のアプリケーションと VisualVM)がこの環境変数を同期する必要があります。 そのため、この環境変数をサービスと VisualVM を実行しているコンテキストと同じ値に設定する必要があります。

ご利用の Wrapper コンフィギュレーションファイルで Wrapper プロセス用に環境変数「TMP」を設定してください:
set.TMP=C:\tmp

その後、サービスを(再)起動してください。 次に、ここでコンソールを開始して、「TMP」 環境変数を上記のコンフィギュレーションファイルで指定した値と同じ値に設定してください:

コマンド:
set TMP=C:\tmp
C:\Program Files\...\jvisualvm.exe

VisualVM は Java プロセスを一覧にすることができるはずです。

Windows XP までは Windows 版用に上記が動作していましたが、Windows Vista/7(さらに後続版)は、より厳しくなったセキュリティ測定のため、 ほとんど誰にも許可しないでしょう。そのため、これを解決する唯一の方法は、JMX リモートモニタリング設定(必要要件:最低でも Java 1.5)を利用することです。

ご利用の Wrapper コンフィギュレーションファイルに、次のプロパティを設定してください:
wrapper.java.additional.N=-Dcom.sun.management.jmxremote.port=XXXX
wrapper.java.additional.N=-Dcom.sun.management.jmxremote.ssl=false
wrapper.java.additional.N=-Dcom.sun.management.jmxremote.authenticate=false

wrapper.java.additional.<n>] プロパティで 未使用の番号 「N」 を利用して、ご利用のマシン上で 「XXXX」 を未使用ポート番号で置き換えてください。 VisualVM から [ファイル] → [JMX 接続を追加する] を選択してください。 [接続] フィールドで、「localhost:XXXX」(XXXX は conf ファイルで割り当てたポートです)を入力してください。

情報

JMX モニタリングやマネジメントについて、さらに詳しくは、 JMX コントロール サイト をご覧いただくか、あるいは、 オラクルドキュメンテーション(英文)をご確認ください。

仮想マシンで固定の MAC アドレスを設定するにはどうすればいいですか?

自動化ツールを使用して仮想マシンが常に削除および作成される環境で(MAC アドレスに基づく)HostId がサーバーライセンスキーのものと異なるものになった場合、Wrapper は直ぐに停止します。 その場合、ライセンスオーナーが手動でライセンスキーをリセットする必要があり、仮想マシン作成の自律的プロセスを中断させます。 ご利用中の仮想化ツールにより、固定の MAC アドレスを設定することが出来ます。 常に同じ MAC アドレスを使用することで、Wrapper はライセンスキーのエラーなく、確実に開始できます。

次のドキュメンテーションをご参照ください: