- PR -

propertiesファイルについて

投稿者投稿内容
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-11-03 23:52
またまた失礼します。

現在Weblogicのサーバでwebアプリを製作しています。
Windowsのローカル開発環境では全く問題ないのですが、
Warファイルに固めてlinuxで動かすと読み取ってくれません。

呼び出し部のソース部はこんな感じです。
Properties properties = new Properties();
String infoPath = "";

try {
 Method method = null;
 try {
  method = Thread.class.getMethod("getContextClassLoader", null);
 } catch (NoSuchMethodException e) {}
 ClassLoader classLoader = null;
 try {
  classLoader = (ClassLoader) method.invoke(Thread.currentThread(), null);
 } catch (IllegalAccessException e) {
 } catch (InvocationTargetException e) {}
 properties.load(new FileInputStream(classLoader.getResource("@propertiesFileName").getFile()));
 } catch (FileNotFoundException e) {
 } catch (IOException e) {}
 infoPath = properties.getProperty(key);

linuxマシーンが客先にあり、デプロイしたwarファイルをいくつかパターンで
テストしてみたいのですが。
今、一つ試したいのが、
 <message-resources parameter="/@propertiesFileName"/>
と記して実行できるか試してみたいのですが、他にpropertiesファイルを
呼ぶ為に必要な設定について知ってらっしゃる方いましたら、よろしくお願いします。

ちなみにpropertiesファイルは%APP_HOME%/build/classes直下にあります。
(WARを解答しても確かに存在してます。)
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-11-03 23:53
>今、一つ試したいのが、
> <message-resources parameter="/@propertiesFileName"/>
>と記して実行できるか試してみたいのですが、他にpropertiesファイルを

これはweb.xmlに追加してという意味です、すいません。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-11-04 02:00
まず、うまくいかない原因が Linux にあるのか、war に固めたことにあるのか、開発環境と違うマシンということにあるのか切り分けてみてはいかがでしょうか。
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-11-04 02:35
ありがとうございます。

おっしゃるとおりですが、今回は環境も含めてのテストにしなければいけないのです。
と言いますのも、propertiesファイルを読み込まない為、javaソースに本来propertiesファイルに書き出す設定情報をべた書き(const値)にして同じような手順でWARにした結果、linux上での動作を確認しました。

そのため、原因究明とともに設定として何が足りないのかも含め、動作しなければいけなくなった次第です。
そこで、私が思いつくのは、web.xmlに設定してやることぐらいでして・・。

よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-11-04 02:43
「今回は環境も含めてのテストにしなければいけない」というのが良く意味が分からないのですが、まずは war に固めても手元の Windows の環境で動作するかどうか確認すべきではないでしょうか?

おそらく war に固めていたら FileInputStream では読み込めませんから、そこに原因があると思います。
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-11-04 04:52
ありがとうございます。

教えていただいた点を検索してみまして、JBOSSの時の話のようでしたが、
web.xmlがWEB-INFの直下に無い為読み込まれないような事が書いてありました。(?)
http://nemuneko.com/nifty/java/zip.html

ただ、Weblogicではディレクトリ構造でweb.xmlがWEB-INF直下にあるので問題ないのではと感じました。

このWARファイルに固めると「FileInputStreamでは読み込めません」というのをもう少し教えていただけないでしょうか?
web.xmlにプロパティファイル名を書き出しても無駄ということでしょうか?

すいません、Windows機でまだ試していません、やってみます。
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-11-04 11:59
こんにちは。

WARファイルをWindowsXP環境で試しましたが、問題なく読み取ってくれました。
何が原因なのか、さっぱり分かりません。。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-11-04 12:48
コード:
path = xxxxx;

ClassLoader loader = Thread.currentThread().getContextClassLoader();
Properties prop = new Properties();
InputStream in = loader.getResourceAsStream(path);
if(in == null){
    //ファイルが存在しない場合の処理
    //必要なら終了
}

try{
    prop.load(in);
}catch(IOException e){
    //例外処理
}


と言うようなコードでよいのでは。

・Thread#getContextClassLoaderをリフレクションで操作する必要はない
・クラスローダでリソースを直接ストリームで取得(もしくはURL#openStream())
・例外を握りつぶさない

と言う点が気になりました。
ちなみにURL#getFile()ではFileにできるパスが返るとは限りません。
クラスローダの実装によって、どんなパスが返るか実行時まで判断できません。
したがってFileInputStreamに渡した段階でエラーになる可能性も非常に高いです。

環境の問題ではなく、環境に依存するコードを書いているのが問題です。
ましてや例外処理を握りつぶしている為、エラーの判断が難しくなっていますよね。

私がおかしいと特に思うのが、URL#getFile()です。
戻り値を確認してみてください。

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