その他のセクションも役に立ちますので是非ご覧ください:
デフォルトでは、SYSTEM ユーザーとして Windows サービスを動作させます。 この「ネットワークドライブにアクセスできない」問題の原因は、SYSTEM ユーザーは、ネットワークリソースにアクセス権がないからです。 もし、アプリケーションが Windows サービスとして正常に動作しているならば、 まず最初に試してみることは、コンソールアプリケーションとして正常に動作する時と 同じユーザーでログインして、サービスを動かしてみることです。
その手順を説明すると、
そうすると、サービスはコンソールアプリケーションとして動作しているのと同じ環境で動いていますので、 全てが問題なく正しく動作するはずです。
セキュリティ要件に応じて、特にこのサービス用に、新しいユーザーを作成および設定をすることもできます。
一部のシステム上では、システムの再起動時に、 本当のユーザーが実際にログインして、そのドライブへ接続するまで、 ドライブレター(ドライブを示すアルファベット)を割り当てられたドライブが、 常にアクセス可能というわけではないようです。 この問題の回避手段としては、割り当てられたドライブレターではなく、 ドライブを直接的に参照する UNC 形式(マシン名を含むフルパス)を使うことです。
//host/share/path
[CTRL]+[BREAK] や [CTRL]+[\]のキー操作、あるいは、API 経由でスレッドダンプを要求すると、ログに次のようなメッセージが表示され、JVM が再起動します:
wrapper | JVM exited unexpectedly.
まず、JVM を起動する際に、[-Xrs フラグ] を指定していないことを確認してください。 このフラグは、Wrapper を使わずに Java を動かす環境では便利ですが、Wrapper の様々なシステムシグナルに応答できる能力を損ないます。
Wrapper の設定で、 JVM がシステムシグナルを無視するには、 代わりに[wrapper.ignore_signals] プロパティをご利用ください。 設定を変更する際には、必ず事前に説明を読んでください。
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.java.command=%JAVA_HOME%/bin/java
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; };
一部の 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] プロパティを設定することで変更が可能です。
重要 - 余計なことで頭を悩ます無駄な時間を削減するためにも、変更操作に入る前に [作業ディレクトリー] のプロパティ説明を十分に読んでください。
Windows で複数の Wrapper を動かしている時、タスクマネージャーには、 全て 「wrapper.exe」 や 「java.exe」 と表示されているため、 どれがどのアプリケーションなのか識別するのは困難です。 Windows セキュリティ上の理由から、Wrapper に表示名を変更する機能を実装することは不可能です。
この回避策として、ややハッキングっぽい手荒な方法ですが、効果的です。
Windows タスクマネージャーを見ると、どの実行ファイルが動作しているのか、 簡単に確認することができます。
「wrapper.conf」ファイルで、[wrapper.pidfile] プロパティや、 [wrapper.java.pidfile] プロパティを設定することもできます。 そうすると、pid を含むファイルが作成されます。 これらの pid は、タスクマネージャに表示されている pid と比較することができます。 プロセス pid を表示するように、タスクマネージャーの設定を変更する必要がありますので ご注意ください。
Windows 上では、[wrapper.ntservice.account] プロパティを設定することで、特定のユーザーとして Wrapper を動かすことができます。 その説明を熟読してからサービスを再インストールしてください。
UNIX 上では、Wrapper シェルスクリプト 「src/bin/App.sh.in」(Wrapper の旧バージョンのファイル名:「sh.script.in」)で「RUN_AS_USER」変数を設定します。 [console] コマンドで動作中には、Wrapper はカレントユーザーとして動作しますが、[start] コマンドで動かす場合、指定されたユーザーへ変更してから Wrapper を起動します。 つまり、カレントユーザーは「ユーザー変更」の権限を持っている必要があります。
もし、Java アプリケーションが Windows サービスとして動作しているならば、 それは実際には VisualVM を起動しているユーザーと同じコンテキスト/セッションで動作していません。 従って、デフォルトで、VisualVM は Java アプリケーションを見つけることができません。
Windows XP までは、Windows サービス用のゆるいセキュリティポリシーによって、 次のステップのように、かなり簡単に解決を可能にしていました:
JVM が開始している時点で、JVM はそのプロセスとフック情報を環境変数 「%TMP%」 で指定された配置場所へを書き込んでいます。 一部の(こちらを含む)環境変数が各ユーザー用に別々に定義されていることを念頭に置いておいてください。 そのため、2つのプロセス(自分のアプリケーションと VisualVM)がこの環境変数を同期する必要があります。 そのため、この環境変数をサービスと VisualVM を実行しているコンテキストと同じ値に設定する必要があります。
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.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 アドレスに基づく)HostId がサーバーライセンスキーのものと異なるものになった場合、Wrapper は直ぐに停止します。 その場合、ライセンスオーナーが手動でライセンスキーをリセットする必要があり、仮想マシン作成の自律的プロセスを中断させます。 ご利用中の仮想化ツールにより、固定の MAC アドレスを設定することが出来ます。 常に同じ MAC アドレスを使用することで、Wrapper はライセンスキーのエラーなく、確実に開始できます。
次のドキュメンテーションをご参照ください: