- PR -

設定ファイルパス名の渡し方について

投稿者投稿内容
とおる
会議室デビュー日: 2003/09/18
投稿数: 10
投稿日時: 2003-09-19 15:22
こんにちは。

利用者が動作を制御できるように
コンポーネント開発者はコンポーネントに
何らかの方法でパラメータを渡せるようにすると思います。

今回作成しようとしているコンポーネント(Webアプリ用)に対しては
XMLファイルを通してパラメータを渡そうと思っているのですが、
このXMLファイルのパス名(但し、ファイル名は固定)をどのようにして
コンポーネントに教えたらよいのかと迷っています。
次のような方法が浮かぶのですが、他によい方法はあるのでしょうか。
また、これらの方法の優劣、注意点などありましたら
ご指摘いただけるとうれしいです。
-------------------------------------
(1)システムプロパティで設定する
(2)クラスパスに設定ファイルを置くようにしてコンポーネントが探すようにする。
(どうやって探すのだろう・・・汗)
(3)今回作成するコンポーネントはWebアプリで利用されるので、WEB-INFディレクトリの
直下に置くことに決める。
-------------------------------------

よろしくお願いします。
ウラタン
常連さん
会議室デビュー日: 2003/07/25
投稿数: 29
投稿日時: 2003-09-19 16:24
ポリシーの部分も多いように思えます。
性能的な優劣はよく判りませんので、使いやすい方法で良いのでは?

そのサーバーマシン全体に反映させたいなら、プロパティで設定するのが
手っ取り早いと思います。
Windowsなら、レジストリに入れちゃうってのもアリです。

起動バッチレベルで切り替えたいならJavaへのVMパラメータとして設定す
れば扱いやすいかもしれないっすね。
java.exe -Dxxx_PATH=C:\xxxxxxx.xml

ユーザーごとに切り替えたいなら、環境変数でやるといいかも。

目的がパスなどの指定ってことだと、Webアプリが持つxmlに書くのは
あまりお勧めでないかも。
コンパイルしてwarなりearなりを作った時に中に埋め込まれちゃうので、
他のマシン用にビルドする時にいちいちxmlを書き換えないといけないで
すね。

クラスパスに置くのはやめませう。
つうか、できるのか知りません(^^;;
もしできたとしても、クラスパスは環境によって見る順番とか変わるので
危険っぽい気がします。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-09-19 16:58
こんにちはWataです。
どの方法が望ましいかはわかりませんが、クラスパスからファイルを探す場合は、
java.lang.Class#getResourceAsStream(String name)を使用することで可能です。
PAL
ベテラン
会議室デビュー日: 2002/11/14
投稿数: 63
投稿日時: 2003-09-19 17:09
引用:

ウラタンさんの書き込み (2003-09-19 16:24) より:
クラスパスに置くのはやめませう。
つうか、できるのか知りません(^^;;
もしできたとしても、クラスパスは環境によって見る順番とか変わるので
危険っぽい気がします。



ClassLoader _loader =(ClassLoader) _method.invoke(Thread.currentThread(), null);
_urlPropFile = _loader.getResource(PROPERTIES_FILENAME);

として問題なく取得できていますが。。。。
Classパスの方がpropertyファイルの置き場として良い気がします。
log4j.propertiesもそこに置いていますし。
とおる
会議室デビュー日: 2003/09/18
投稿数: 10
投稿日時: 2003-09-19 17:18
ウラタンさん
返信ありがとうございます。

> そのサーバーマシン全体に反映させたいなら、プロパティで設定するのが
> 手っ取り早いと思います。
システムプロパティだとサーバプロセス全体に設定されるということを
見落としていました。

> Windowsなら、レジストリに入れちゃうってのもアリです。
これは、Javaからレジストリにアクセスできるということなのでしょうか。
それとも、Javaで実装されていないWindowsアプリケーションに
関するお話でしょうか。
いずれにせよ、この場合はポータビリィティが損なわれると思いますので、
今回は採用しないと思います。

> ユーザーごとに切り替えたいなら、環境変数でやるといいかも。
Javaでもgetenvのような環境変数にアクセスする
メソッドがあった(今でもある?)と記憶しているのですが、
確か推奨されていなかったように思います。

> 目的がパスなどの指定ってことだと、Webアプリが持つxmlに書くのは
> あまりお勧めでないかも。
これは、web.xmlファイルのことでしょうか。
基本的にweb.xmlファイルに登録されたパラメータは
サーブレットがアクセスすると認識していますので、
サーブレットがコンポーネントにパラメータを渡さなければ
ならなくなってしまいますね。

> クラスパスに置くのはやめませう。
> つうか、できるのか知りません(^^;;
> もしできたとしても、クラスパスは環境によって見る順番とか変わるので
> 危険っぽい気がします。
ご指摘の通り、クラスパス上に同じ名前のファイルがあった場合、
混乱するといった注意点がありますね。

今回はWebアプリケーション単位で設定を変更可能にしたいのですが、
うーーーん、するとどれがいいのかな?(笑)

Log4Jのようなコンポーネントを参考にしたらよいのかな。^^
とおる
会議室デビュー日: 2003/09/18
投稿数: 10
投稿日時: 2003-09-19 17:27
Wataさん、PALさん
返信ありがとうございます。

クラスパスから設定ファイルを見つけるコードを
提示していただきまして、ありがとうございます。
この2つのコードには何か大きな違いがあるのでしょうか。

Log4Jでもクラスパスから探しているのですね。
私もクラスパスから設定ファイルを探そうかな
と思いはじめています。^^;

ありがとうございました。

PAL
ベテラン
会議室デビュー日: 2002/11/14
投稿数: 63
投稿日時: 2003-09-19 17:33
引用:

とおるさんの書き込み (2003-09-19 17:27) より:
この2つのコードには何か大きな違いがあるのでしょうか。
Log4Jでもクラスパスから探しているのですね。


log4jのソースを分かりやすく書いただけです。^^;
パスを見つける所までですが。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-09-19 18:13
こんにちはWataです。
引用:

とおるさんの書き込み (2003-09-19 17:27) より:
Wataさん、PALさん
返信ありがとうございます。

クラスパスから設定ファイルを見つけるコードを
提示していただきまして、ありがとうございます。
この2つのコードには何か大きな違いがあるのでしょうか。


PALさんが示しているコードは、リフレクションが含まれているようで
ちょっとよくわからないのですが、
違いとしては、Class#getResourceAsStream()かClassLoader#getResourceAsStream()
かの違いがあります。
試してみたところ、Classの方は'/'から始まるファイルパスを指定すると、
クラスパスからの相対パスでファイルを検索し、それ以外はClassのパッケージからの
相対パスでファイルを検索するようです。
ClassLoaderの場合は、常にクラスパスからの相対パスでファイルを検索するようです。

クラスからの相対パスにすれば、間違ったファイルをロードする可能性は低くなりますが、
ファイルの格納先は限定されることになります。

詳しくはjavadocを見て、試してみてください。

スキルアップ/キャリアアップ(JOB@IT)