- PR -

プロパティファイルの配置場所

投稿者投稿内容
Mura
会議室デビュー日: 2004/06/22
投稿数: 4
投稿日時: 2004-06-22 17:51
初めて投稿します。
Tomcat5.0.25を使用してサーブレットからプロパティファイルを読み込む
プログラムを作成してます。

プロパティファイルをWEB-INF\classes内に配置したのですが読み込もうとすると
java.io.FileNotFoundExceptionエラーがでるので、どこのフォルダを参照しているのかを
調べるためにstoreメソッドでプロパティファイルを作成したみたところ
C:\WinNT\system32の中にプロパティファイルが作成されていました。

C:\WinNT\system32の中にプロパティファイルを入れておけば読み書きできるようなのですが、
これをWEB-INF\classes内に置いて読み書きできるようにするにはどうすれば良いのでしょうか?


なお、Tomcatの『Monitor Tomcat』から実行した場合はSystem32フォルダで、
『startup.bat』からTomcatを実行した場合はTomcatのインストールフォルダ
(Tomcat 5.0のすぐ下)でプロパティファイルを認識しました。


ご教授お願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-06-22 18:37
getRealPath()で取得したパスに保存してはいかがでしょうか。
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.html#getRealPath(java.lang.String)

ただ、クラスタ化した場合に問題になりそうですので永続化したい情報は一般的に DB へ格納するのが安全です。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-06-22 19:05
ごめんなさい、ちゃんと読まずにレス返してました…
消去。

大ベテランって何事ですかorz

[ メッセージ編集済み 編集者: シュン 編集日時 2004-06-22 19:21 ]

あれ?やっぱり間違っていなかったみたいですね。
最初に書いておいた内容を復帰します。

プロパティファイルの読み込み方は、以下の方法がセオリーだと思います。
システムのインストール先の環境に依存しないようにするために、プロセスのコンテキストから見える位置にリソースを配置して、APIでルックアップしましょう、ということですね。

1.クラスパス上にプロパティファイルを配置
2.ClassLoader#getResource()(ServletプログラミングならばServletContext#getResource())でルックアップ、Propertiesでロード
ClassLoader#getResourceAsStream()(ServletプログラミングならばSerervletContext#getResourceAsStream())でルックアップ、Propertiesでロード
あるいはResoucreBundleのロード機能を利用してResoucrceBundle#getBundle()でロード

getRealPath()は、Servletエンジンの実装によっては正しい値を返さないこともあるので、使うな、と昔どこかの資料で見た覚えがありますよ。

[ メッセージ編集済み 編集者: シュン 編集日時 2004-06-23 10:19 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-06-22 19:29
どのようにプロパティファイルを読み込んでいるのでしょうか?
私が同様のことをする場合には、ClassLoader#GetResourceAsStreamを使用することが
多いです。その場合クラスローダには、WEB-INF/classes以下に配置されたクラスがロード
されているものを指定したほうがいいでしょう。
Mura
会議室デビュー日: 2004/06/22
投稿数: 4
投稿日時: 2004-06-22 19:54
ご返事ありがとうございます。

getRealPath()でのパスの取得はうまくいったのですが、"使用すべきでない"との警告
がでました。


プロパティファイルの読み取りの為にテスト的にサーブレットを作っていたので話が
ズレてしまっていたのですが、
Webアプリで使うデータベースのパスをプロパティファイルに登録しておこうと思い、
そのプロパティファイルを読み取る為のクラスを作成中でした。
具体的にはサーブレットからではなくビジネスロジック内からそのクラスを経由して
プロパティファイルの読み取りをしたかったのですが・・。


サーブレットでのテストでは以下のようなソースで読込んだ内容を表示できるか
試していました。

String initialFile = "javahello.properties";
java.util.Properties prop = null;
String readData = "";
prop = new java.util.Properties();
try {
FileInputStream ips = new FileInputStream( initialFile );
prop.load( ips );
out.println("読込成功!");
out.println(prop.getProperty("data"));
readData = prop.getProperty("data");
} catch (Exception ex) {
out.println("読込でエラー発生");
out.println(ex.getMessage() );
ex.printStackTrace();
}
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-06-22 20:52
propertiesファイルって、一般的にはこうやって取るものじゃないでしょうか?

コード:

ResourceBundle bundle    = ResourceBundle.getBundle("javahello");


これなら、WEB-INF\classes にjavahello.properties を置けば見えるはずですが。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-06-22 20:56
引用:

Muraさんの書き込み (2004-06-22 19:54) より:
FileInputStream ips = new FileInputStream( initialFile );


この部分を、
InputStream ips = this.getClass().getClassLoader().getResourceAsStream( initialFile );
にしてみてください。
Mura
会議室デビュー日: 2004/06/22
投稿数: 4
投稿日時: 2004-06-23 11:00
ご返事ありがとうございます。


引用:

Clusterさんの書き込み (2004-06-22 20:52) より:
ResourceBundle bundle = ResourceBundle.getBundle("javahello");


これでもできたのですが、ResourceBundleは多言語対応のために使用するようで、
javahello_ja.propertiesと名前を変更しなければいけませんでした。
使うのは日本のみであってもプロパティファイルにはデータベースへのパスを
格納しておきたかったので、用途が違うのかと思いためらってました。



引用:

ukさんの書き込み (2004-06-22 20:56) より:
InputStream ips = this.getClass().getClassLoader().getResourceAsStream( initialFile );
にしてみてください。


これでWEB-INF/classesから読み取ることができました。ありがとうございます^^

一つ疑問なんですが、プロパティファイルを読むにはHttpServletを継承している
サーブレットクラス内からでないと読むことはできないのでしょうか?

イメージ的には
[HelloWorldServlet]→[データの取得をするクラス]→[データベースへアクセスするクラス]
→[プロパティファイルを読み取るクラス]

というような感じに[プロパティファイルを読み取るクラス]内でサーブレットは意識せずに
プロパティファイルへアクセスしたかったのですが・・。

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