- - PR -
セッションビーンからだとResourceBundleで指定されたプロパティファイルを見つけられなくなる。
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-18 18:57
自分はResourceBundleを使うのが結構好きなのですが、理由のひとつとして、src配下(つまりbin配下)においておけば、絶対パスを指定せずに読みにいってくれるからなのですが、それはJavaApplicationのときの場合でした。
今回JavaApplicationでいままで動いていたモジュールを急遽Jbossのセッションビーンからコールして使う必要が出てきたのですが そのとたんに探しにいってくれなくなりました。これはいったいなぜなのでしょうか? 例)src/SYSProp.propertiesをおいて ResourceBundle resourcebundle = ResourceBundle.getBundle("SYSProp"); FECPORT = resourcebundle.getString("FECPORT"); // これでいままで取り出せていたものが、Statelessなセッションビーンで呼び出しをすると 18:36:19,694 INFO [STDOUT] java.util.MissingResourceException: Can't find bundle for base name SYSProp, locale ja_JP 18:36:19,694 INFO [STDOUT] at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:839) 18:36:19,694 INFO [STDOUT] at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:808) 18:36:19,694 INFO [STDOUT] at java.util.ResourceBundle.getBundle(ResourceBundle.java:552) 18:36:19,694 INFO [STDOUT] at fec.SysPropFEC.<clinit>(SysPropFEC.java:85) と出てきてしまうんです。 その場合、どこから指定しなければいけないのか。また結局コードの修正は避けられないのかを教えていただきたいです。 ちなみに、この外部呼出しのクラスはJNDI名をつけていません。(できればつけないで呼び出したい) よろしくお願いいたします。 環境: j2sdk1.4.2_07 jboss3.2.5 eclipse3.0.1 oracle 9i を使っています。 | ||||||||||||
|
投稿日時: 2005-05-18 19:14
EJBを使用すると例えば、今まで一つのwarで管理してたものをjar(EJB)とwarで
管理しなおすことになると思います。 その際、そのsrc配下のpropertiesファイルはwarの管理下にあるんだと予測する のですが。EJBから管理が異なる場所への参照が解決できないということになる んでしょうか。言い方がむずかしい。。 # VMが異なるイメージ?私も詳細をこと細かに理解していないのですが・・ ということで解決策としては、そのpropertiesはjarの中に含めなければならい のではないでしょうか。 あと気になったのですが、EJBのお作法としてローカルファイルへの参照は あまり頂けないことだと記憶してたのですが、どうなんだろう。 | ||||||||||||
|
投稿日時: 2005-05-18 19:16
セッションBeanと一緒にパッケージングすればいいのではないですか?
そのリソースファイルがどのように配置されているかわかりませんが、セッションBeanが ロードされるクラスローダから参照可能な場所にないとセッションBeanから利用することは できません。 | ||||||||||||
|
投稿日時: 2005-05-18 19:16
ResourceBundleクラスをロードしているClassLoaderのクラスパスに
SYSProp.propertiesが置いてあるディレクトリが通っていないと、 見つけられないはずですよ。 | ||||||||||||
|
投稿日時: 2005-05-18 19:58
皆様!ありがとうございます。
早速、jar にプロパティを含ませて見たところ、見事に解決されました。 ありがとうございます。 ところで、自分はbin配下をフォルダーごとjarに指定していたのですが、それではだめなのですね。.classしか入らないみたいです。 ClassLoaderのクラスパスに通していないとだめとのことですが、 自分はgetBundleの引数1つのやつしか使ったことがないです。 ロケールやクラスローダーの指定をどうするのかしらないだけなんですが、皆さんはそういう使いかたをしていらっしゃるんでしょうか? セッションビーンと一緒に含めるやり方は、設計段階で判明しているものはいいんですが、流用の場合はなかなか難しそうです。 いろいろとご意見ありがとうございます。大変参考になります。 | ||||||||||||
|
投稿日時: 2005-05-18 20:12
「bin配下をフォルダーごとjarに指定」というのは、具体的にはどういうことでしょうか。 binの下にリソースファイルはあるのですよね?
ロケールはこの場合は関係ないのでおいておいて、コードの方で配置を意識したりはしません。 パッケージングなり配置なりでリソースファイルを読めるようにしておきます。クラスローダの 階層構造についてはアプリケーションサーバによって異なるので、マニュアルを読むことをお勧め します。
最悪の場合、アプリケーションサーバの起動クラスパスにおいておけば読むことができるでしょうが、 そうなったら間違いなく設計ミスですね ![]() | ||||||||||||
|
投稿日時: 2005-05-18 20:55
ちょっと僕は勘違いしてました。プロパティファイルの性質上、それはjarに含めるべきではなく、外出しにすべきである・・・という指摘を受けまして、外部に置くことを検討しています。とりあえず、jarからだして同じ場所(例)C:\jboss-3.2.5\server\default\deploy)においたのですが、エラーの連続でした。
そっかだめなのか。。。ということでしっかりとパッケージきらないとだめっぽいのですが、クラスパスさえ通せばいけるのかというと・・・いけないです。 C:\var\opt\fmj\prop\fecにおいてシステムの環境変数でクラスパスを通してみてもJBOSSは呼んではくれないです。うーむ。 引用: 「bin配下をフォルダーごとjarに指定」というのは、具体的にはどういうことでしょうか。 binの下にリソースファイルはあるのですよね? これは、JBOSS−IDEを使って設定したのですが、通常のクラスパスをフォルダー単位でも指定できるんですが、.propertiesファイルは除外されているのです。そういう設定なのかな。。。 ところで、プロパティはjarに含めてはいけないことになったので、別の方法を探索してるところです。。。 クラスローダの設定をしなきゃいけないかもしれないのですが、どうやるのかは解りません。。。 | ||||||||||||
|
投稿日時: 2005-05-18 21:09
このディレクトリは何のディレクトリでしょうか? JBoss起動時にどのようなクラスパスを参照しているのか調べてください。手元にはJBoss4 しかないのですが、JBoss4であれば、JBOSS_CLASSPATHという環境変数を参照しているようです。 |