- - PR -
設定ファイルパス名の渡し方について
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-09-19 15:22
こんにちは。
利用者が動作を制御できるように コンポーネント開発者はコンポーネントに 何らかの方法でパラメータを渡せるようにすると思います。 今回作成しようとしているコンポーネント(Webアプリ用)に対しては XMLファイルを通してパラメータを渡そうと思っているのですが、 このXMLファイルのパス名(但し、ファイル名は固定)をどのようにして コンポーネントに教えたらよいのかと迷っています。 次のような方法が浮かぶのですが、他によい方法はあるのでしょうか。 また、これらの方法の優劣、注意点などありましたら ご指摘いただけるとうれしいです。 ------------------------------------- (1)システムプロパティで設定する (2)クラスパスに設定ファイルを置くようにしてコンポーネントが探すようにする。 (どうやって探すのだろう・・・汗) (3)今回作成するコンポーネントはWebアプリで利用されるので、WEB-INFディレクトリの 直下に置くことに決める。 ------------------------------------- よろしくお願いします。 | ||||
|
投稿日時: 2003-09-19 16:24
ポリシーの部分も多いように思えます。
性能的な優劣はよく判りませんので、使いやすい方法で良いのでは? そのサーバーマシン全体に反映させたいなら、プロパティで設定するのが 手っ取り早いと思います。 Windowsなら、レジストリに入れちゃうってのもアリです。 起動バッチレベルで切り替えたいならJavaへのVMパラメータとして設定す れば扱いやすいかもしれないっすね。 java.exe -Dxxx_PATH=C:\xxxxxxx.xml ユーザーごとに切り替えたいなら、環境変数でやるといいかも。 目的がパスなどの指定ってことだと、Webアプリが持つxmlに書くのは あまりお勧めでないかも。 コンパイルしてwarなりearなりを作った時に中に埋め込まれちゃうので、 他のマシン用にビルドする時にいちいちxmlを書き換えないといけないで すね。 クラスパスに置くのはやめませう。 つうか、できるのか知りません(^^;; もしできたとしても、クラスパスは環境によって見る順番とか変わるので 危険っぽい気がします。 | ||||
|
投稿日時: 2003-09-19 16:58
こんにちはWataです。
どの方法が望ましいかはわかりませんが、クラスパスからファイルを探す場合は、 java.lang.Class#getResourceAsStream(String name)を使用することで可能です。 | ||||
|
投稿日時: 2003-09-19 17:09
ClassLoader _loader =(ClassLoader) _method.invoke(Thread.currentThread(), null); _urlPropFile = _loader.getResource(PROPERTIES_FILENAME); として問題なく取得できていますが。。。。 Classパスの方がpropertyファイルの置き場として良い気がします。 log4j.propertiesもそこに置いていますし。 | ||||
|
投稿日時: 2003-09-19 17:18
ウラタンさん
返信ありがとうございます。 > そのサーバーマシン全体に反映させたいなら、プロパティで設定するのが > 手っ取り早いと思います。 システムプロパティだとサーバプロセス全体に設定されるということを 見落としていました。 > Windowsなら、レジストリに入れちゃうってのもアリです。 これは、Javaからレジストリにアクセスできるということなのでしょうか。 それとも、Javaで実装されていないWindowsアプリケーションに 関するお話でしょうか。 いずれにせよ、この場合はポータビリィティが損なわれると思いますので、 今回は採用しないと思います。 > ユーザーごとに切り替えたいなら、環境変数でやるといいかも。 Javaでもgetenvのような環境変数にアクセスする メソッドがあった(今でもある?)と記憶しているのですが、 確か推奨されていなかったように思います。 > 目的がパスなどの指定ってことだと、Webアプリが持つxmlに書くのは > あまりお勧めでないかも。 これは、web.xmlファイルのことでしょうか。 基本的にweb.xmlファイルに登録されたパラメータは サーブレットがアクセスすると認識していますので、 サーブレットがコンポーネントにパラメータを渡さなければ ならなくなってしまいますね。 > クラスパスに置くのはやめませう。 > つうか、できるのか知りません(^^;; > もしできたとしても、クラスパスは環境によって見る順番とか変わるので > 危険っぽい気がします。 ご指摘の通り、クラスパス上に同じ名前のファイルがあった場合、 混乱するといった注意点がありますね。 今回はWebアプリケーション単位で設定を変更可能にしたいのですが、 うーーーん、するとどれがいいのかな?(笑) Log4Jのようなコンポーネントを参考にしたらよいのかな。^^ | ||||
|
投稿日時: 2003-09-19 17:27
Wataさん、PALさん
返信ありがとうございます。 クラスパスから設定ファイルを見つけるコードを 提示していただきまして、ありがとうございます。 この2つのコードには何か大きな違いがあるのでしょうか。 Log4Jでもクラスパスから探しているのですね。 私もクラスパスから設定ファイルを探そうかな と思いはじめています。^^; ありがとうございました。 | ||||
|
投稿日時: 2003-09-19 17:33
log4jのソースを分かりやすく書いただけです。^^; パスを見つける所までですが。 | ||||
|
投稿日時: 2003-09-19 18:13
こんにちはWataです。
PALさんが示しているコードは、リフレクションが含まれているようで ちょっとよくわからないのですが、 違いとしては、Class#getResourceAsStream()かClassLoader#getResourceAsStream() かの違いがあります。 試してみたところ、Classの方は'/'から始まるファイルパスを指定すると、 クラスパスからの相対パスでファイルを検索し、それ以外はClassのパッケージからの 相対パスでファイルを検索するようです。 ClassLoaderの場合は、常にクラスパスからの相対パスでファイルを検索するようです。 クラスからの相対パスにすれば、間違ったファイルをロードする可能性は低くなりますが、 ファイルの格納先は限定されることになります。 詳しくはjavadocを見て、試してみてください。 | ||||
