Notes/Domino6.5のJava実行環境のクラスパス
「Lotus Notes/Domino 6.5」は、Java実行環境として「Java2」(JRE1.3.1)相当のものを持っています。Java2ではクラスパスに関する仕様が変更されており、「Notes/Domino 6.5」のJava実行環境もこれに準じています。
1. ノーツクライアントのクラスパス
適当なデータベースにJavaエージェントを作成し、システムプロパティ「sun.boot.class.path」を取得するコード(例えば以下のコード)を実行する、適当なJavaプログラムソースを作成しエージェントを完成させます。
...
Properties sp = System.getProperties();
String name = "sun.boot.class.path";
String value = sp.getProperty(name);
System.out.println(name + " = " + value + "\n");
...
そしてノーツクライアント上で実行すると、以下のような内容が得られます。
sun.boot.class.path = .;D:\Lotus\Notes65\njempcl.zip;D:\Lotus\Notes65\Notes.jar;
D:\Lotus\Notes65\liveconn.jar;D:\Lotus\Notes65\XML4j.jar;D:\Lotus\Notes65\LotusXSL.jar;
D:\Lotus\Notes65\jvm\lib\rt.jar;D:\Lotus\Notes65\jvm\lib\i18n.jar;D:\Lotus\Notes65\jvm\lib\tools.jar
(改行を追加しています)
同様にして、拡張機能ディレクトリのパスを取得する「java.ext.dirs」、アプリケーションクラスパスを取得する「java.class.path」の値を確認します。
java.ext.dirs = D:\Lotus\Notes65\jvm\lib\ext
java.class.path = null
2. ドミノサーバーのクラスパス
ドミノサーバー上でも同様の確認をしようと、先のJavaエージェントをスケジュールエージェントにしたものを用意し、ドミノサーバー上で実行させてみます。すると以下のように例外が発生してしまいます。
java.lang.SecurityException
at lotus.notes.AgentSecurityManager.checkPropertiesAccess(AgentSecurityManager.java:523)
at java.lang.System.getProperties(System.java:522)
at ChkBootCPAgent.NotesMain(ChkBootCPAgent.java:11)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(NotesThread.java:215)
これは、例えエージェントの署名者が「制限なしで実行」の権限を持っていても同様です。データベースの設計要素からロードされたクラスの動作には制限があるようです。
2.1. 確認の方法
先のエージェントのJavaプログラムソースをファイルに書き出し、Java2SDK等を用いてコンパイルしてクラスファイルを作成します。
そして、ドミノサーバーのクラスパスに関する値は恐らくノーツクライアントと同様だろうと仮定します。ノーツクライアントでのブートストラップクラスパスにはカレントディレクトリ、つまりインストールディレクトリが含まれています。ドミノサーバーでも同様と考え、作成したエージェントのクラスファイルをドミノサーバーのインストールディレクトリを起点としたディレクトリに配置します。
そして先のJavaエージェントは、ベースクラスはそのままにし(もしくはコンパイルして作成したクラスを入力)し、Javaエージェントに含まれるプログラムは削除してしまいます。
ドミノサーバーを再起動後、エージェントをサーバー上で実行されるようスケジュールすると、以下のような内容が得られます。
sun.boot.class.path = ;D:\Lotus\Domino\Notes.jar;D:\Lotus\Domino\XML4j.jar;
D:\Lotus\Domino\LotusXSL.jar;D:\Lotus\Domino\jsdk.jar;D:\Lotus\Domino\dservlet.jar;
D:\Lotus\Domino\jvm\lib\rt.jar;D:\Lotus\Domino\jvm\lib\i18n.jar;D:\Lotus\Domino\jvm\lib\tools.jar;.
java.ext.dirs = D:\Lotus\Domino\jvm\lib\ext
java.class.path = null
またエージェントのクラスファイルを、拡張機能ディレクトリのクラスパスに含まれるようにしても同じ結果が得られます。
3. JavaUserClasses
ノーツクライアントのnotes.iniファイルに、以下のような「JavaUserClasses」パラメータ行を追加します。パラメータの内容に意味はありません。
JavaUserClasses=C:\MyLib.jar;C:\MyClasses
ノーツクライアントを再起動後、先のシステムプロパティを確認するJavaエージェントを実行すると以下のような内容が得られます。
sun.boot.class.path = .;C:\MyLib.jar;C:\MyClasses;
D:\Lotus\Notes65\njempcl.zip;D:\Lotus\Notes65\Notes.jar;D:\Lotus\Notes65\liveconn.jar;
D:\Lotus\Notes65\XML4j.jar;D:\Lotus\Notes65\LotusXSL.jar;D:\Lotus\Notes65\jvm\lib\rt.jar;
D:\Lotus\Notes65\jvm\lib\i18n.jar;D:\Lotus\Notes65\jvm\lib\tools.jar
(改行を追加しています)
java.ext.dirs = D:\Lotus\Notes65\jvm\lib\ext
java.class.path = null
ドミノサーバーでもnotes.iniファイルに「JavaUserClasses」パラメータ行を追加すると、ノーツクライアントと同様の結果が得られます。
4. 考察
4.1. ドミノサーバーのブートストラップクラスパス
まず始めに気になったのは、ドミノサーバーのブートストラップクラスパスの内容が少し変だということです。ノーツクライアントと同じようにカレントディレクトリが最初にくるはずが、ドットだけ後ろに行ってしまっているのか、それともドミノサーバーではカレントディレクトリを最後にしようとして、セミコロンだけ残ってしまったのか。どちらにしろ間違いなのではと思います。
4.2. なんでもブートストラップクラスパスにある
ノーツクライアント、ドミノサーバーのブートストラップクラスパスの内容を見ると、何でもかんでも詰め込まれています。恐らく、Java実行環境がJDK1.1.8だったNotes/Domino R5でクラスパスに指定していた内容を、Notes/Domino6からはブートストラップクラスパスに指定するようにしたのだと思われます。互換性を意識したのだと思われます。
Javaについて明るいわけではありませんが、やはりブートストラップクラスパスにはJavaプラットフォームに関するものを含め(つまりデフォルト)、その他のものは拡張機能ディレクトリに含まれるようにし、そしてJavaUserClassesパラメータで指定されたものはアプリケーションクラスパスに含まれるようにするべきなのではと思います。
JavaUserClassesパラメータで指定した内容がブートストラップクラスパスの先頭の方に挿入されるということは、ほぼ全てのクラスの動作をオーバライド出来てしまうということです。この事が悪用されることはなかなか無いとは思いますが、その可能性は否定できません。
逆にどうしてもオーバライドせざるを得ない場合も考えられ、「Lotus Domino Designer」ヘルプにはその事を意図したような記述もあります。ただJREで一つのJavaプログラム動かすのとは違い、Notes/Domino上ではその他にもJavaを用いた機能が動作するので、クラスのオーバーライドはそれら全てに影響を与える可能性があります。
Java2でクラスの検索方法が変更されたのには、そのようなことを防ぐ意味合いも少なからずあると思います。例えばブートストラップクラスパスに含める為のNotes.iniパラメータを別途新設すれば、この動作に関する意識を促すこともできるのではと思います。
※上記の内容は、あくまでSakamotoの個人的な興味、好奇心より確かめた内容であり、またあくまで個人的な意見です。参考になさる場合はご自身の責任においてお願いいたします。Sakamotoは一切責任を負いません。
Sakamotoは上記の内容の正誤に関する保証、上記の内容に関するサポートは行いません。またこの旨を伝える返信等も行いません。
| 固定リンク

