プロが教える店舗&オフィスのセキュリティ対策術

内容)tomcat起動時にpropertiesファイルの内容を変更しても、有効にならないのは仕様でしょうか。

Servletから以下のコマンドを使用し、propertiesファイルを読み込む
プログラムを作成しました。

private static final String FILE_NAME = "test.properties";
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream( FILE_NAME );

プログラムを実行し、FILE_NAMEの各キー値をメモしました。
FILE_NAMEの各キーの値を編集後(tomcatの再起動はしていない)、
再度プログラムを実行したところ、以前のpropertiesファイルの
キー値が返ってきてしまいました。

これは仕様でしょうか。

A 回答 (4件)

No2です。



クラスローダの名前は
System.out.println(this.getClass().getClassLoader().class.getName());
でわかります。

あとはそのクラスの実装ですが、Tomcatであればソースコードが公開されているので、それを見ればわかります。

Tomcat未経験ですので、どのクラスローダが使用されているのかわかりませんが、Tomcat6.0.13のソースを見てみました。
例として WebappClassLoader というクラスを見ると、resourceEntries という名の HashMap のフィールドがありここに取得したリソースがキャッシュされています。getResourceAsStream からたどれば、初回取得時に resourceEntries に put され、2回目以降は resourceEntries から get していることがわかります。

こんな感じで調べてみてはいかがでしょう。
    • good
    • 0
この回答へのお礼

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

tomcat4.1を使用しておりまして、
WebappClassLoaderのソースをみたところ、同じような動きを
しておりした。

ClassLoaderを使用しない方法を考えて見ます。

お礼日時:2007/07/26 10:18

> properties.load(inputStream);


ここで使われている、inputStream自身は毎回作られるのでしょうか?

この回答への補足

回答ありがとうございます。

下記のソースプログラムが毎回呼ばれる形になっておりますので、
毎回作られています。

InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream( FILE_NAME );

補足日時:2007/07/25 17:35
    • good
    • 0

tomcat未経験ですが。



一般的にクラスローダが取得したリソースは、初回取得時にキャッシュされます。したがって propaerties ファイルを変更したのであれば、アプリケーションサーバーの再起動が必要だと思われます。

しかし、実際のところその辺の動きは各クラスローダの実装によります。this.getClass().getClassLoader() で取得されるクラスローダがどのように実装しているか調べてみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

初心者で申し訳ありません。
調べ方を教えていただけないでしょうか。

お礼日時:2007/07/25 18:05

そんなことはないです。


コードがそうなってるのではないですか?

この回答への補足

回答ありがとうございます。

コード自体は、毎回propertiesファイルを読み込むように
なっています。

Properties properties = new Properties();
properties.load(inputStream);

という感じでリクエストがくるたびにloadを呼ぶようにしております。

補足日時:2007/07/25 13:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!