- ベストアンサー
tomcat上でのpropertiesファイルの扱いについて
- tomcat上でのpropertiesファイルの扱いについて調査しました。質問者はtomcat起動時にpropertiesファイルの内容を変更しても、有効にならない現象について疑問を持っています。
- Servletからpropertiesファイルを読み込むプログラムを作成した質問者は、ファイルのキー値を編集して再度プログラムを実行しましたが、以前のキー値が返ってきてしまったという結果になりました。
- 質問者はこれが仕様なのかについて知りたいと思っています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No2です。 クラスローダの名前は System.out.println(this.getClass().getClassLoader().class.getName()); でわかります。 あとはそのクラスの実装ですが、Tomcatであればソースコードが公開されているので、それを見ればわかります。 Tomcat未経験ですので、どのクラスローダが使用されているのかわかりませんが、Tomcat6.0.13のソースを見てみました。 例として WebappClassLoader というクラスを見ると、resourceEntries という名の HashMap のフィールドがありここに取得したリソースがキャッシュされています。getResourceAsStream からたどれば、初回取得時に resourceEntries に put され、2回目以降は resourceEntries から get していることがわかります。 こんな感じで調べてみてはいかがでしょう。
その他の回答 (3)
- PED02744
- ベストアンサー率40% (157/390)
> properties.load(inputStream); ここで使われている、inputStream自身は毎回作られるのでしょうか?
補足
回答ありがとうございます。 下記のソースプログラムが毎回呼ばれる形になっておりますので、 毎回作られています。 InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream( FILE_NAME );
- jicchi2
- ベストアンサー率27% (5/18)
tomcat未経験ですが。 一般的にクラスローダが取得したリソースは、初回取得時にキャッシュされます。したがって propaerties ファイルを変更したのであれば、アプリケーションサーバーの再起動が必要だと思われます。 しかし、実際のところその辺の動きは各クラスローダの実装によります。this.getClass().getClassLoader() で取得されるクラスローダがどのように実装しているか調べてみてはいかがでしょうか。
お礼
初心者で申し訳ありません。 調べ方を教えていただけないでしょうか。
そんなことはないです。 コードがそうなってるのではないですか?
補足
回答ありがとうございます。 コード自体は、毎回propertiesファイルを読み込むように なっています。 Properties properties = new Properties(); properties.load(inputStream); という感じでリクエストがくるたびにloadを呼ぶようにしております。
お礼
ありがとうございました。 tomcat4.1を使用しておりまして、 WebappClassLoaderのソースをみたところ、同じような動きを しておりした。 ClassLoaderを使用しない方法を考えて見ます。