5 Replies Latest reply: Mar 27, 2012 10:24 PM by nakamura takuya RSS

    JBoss7.1.0 Finalのプロパティファイルのについて

    nakamura takuya Newbie

      質問させていただきます。

       

      現在、JBoss7.1.0.Finalを使用しております。

      earアプリケーションの中で、プロパティをロードする際、

      プロパティファイルをjar化してear/libに配置し使用しております。

       

      今回の質問の背景には、現在のシステムで、
      クラスパスを通し、別の場所にプロパティファイルを
      配置しておき読み込んでいるため、

      今回JBossAS7.1.0Finalでも同様に

      別の場所にプロパティファイルを配置し実行しようとしましたが

      うまくいきませんでした。

       

      https://docs.jboss.org/author/display/AS7/How+do+I+migrate+my+application+from+AS5+or+AS6+to+AS7

      の、Change ResourceBundle locationの項を見ると
      それらをjar化してear/lib配下に配置せよとの記載があったのですが、この方法しか
      ないのでしょうか?

       

       

      別の場所にプロパティファイルを配置し実行できる方法

      ご存知の方いらっしゃいましたら、ご教示ください。

       

       

      よろしくお願いいたします。

        • 1. Re: JBoss7.1.0 Finalのプロパティファイルのについて
          Takayoshi Kimura Novice

          単なるファイル読み込みならどこからでも読み込めるはずなので、クラスパスにこだわっている、ということはjava.util.ResourceBundleを利用していて、クラスローダを指定していない、という状況でしょうか。

          https://docs.jboss.org/author/display/AS7/How+do+I+migrate+my+application+from+AS5+or+AS6+to+AS7

          の、Change ResourceBundle locationの項を見ると
          それらをjar化してear/lib配下に配置せよとの記載があったのですが、この方法しか
          ないのでしょうか?

          はい、Java EEのデフォルトのクラスローダのスコープは上記であることが仕様で定義されているので、それを使う場合はその方法しかありません。

           

          もともとResourceBundleにはクラスローダを指定する機能がついていますし、クラスローダを作るのもそれほど面倒なことではありません。クラスローダを一つ作ってロードしてやれば良いです。ファイルパスはシステムプロパティにでもしておけば良いでしょう。

           

          String configDir = System.getProperty("jboss.server.config.dir"); // $JBOSS_HOME/standalone/configuration
          URL configDirURL = new File(configDir).toURI().toURL();
          String basename = "message";
          Locale locale = Locale.getDefault();
          URLClassLoader cl = new URLClassLoader(new URL[] {configDirURL});
          ResourceBundle bundle = ResourceBundle.getBundle(basename, locale, cl);
          System.out.println(bundle.getString("foo"));
          
          • 2. Re: JBoss7.1.0 Finalのプロパティファイルのについて
            nakamura takuya Newbie

            Takayoshi Kimura 様

             

            返信ありがとうございます。

             

            もともとResourceBundleにはクラスローダを指定する機能がついていますし、クラスローダを作るのもそれほど面倒なことではありません。クラスローダを一つ作ってロードしてやれば良いです。ファイルパスはシステムプロパティにでもしておけば良いでしょう。

             

            大変参考になりました!

            上記の方法で検証を行いたいと思います。

             

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

             

            • 3. Re: JBoss7.1.0 Finalのプロパティファイルのについて
              nakamura takuya Newbie

              Takayoshi Kimura 様

               

              String configDir = System.getProperty("jboss.server.config.dir"); // $JBOSS_HOME/standalone/configuration
              URL configDirURL = new File(configDir).toURI().toURL();
              String basename = "message";
              Locale locale = Locale.getDefault();
              URLClassLoader cl = new URLClassLoader(new URL[] {configDirURL});
              ResourceBundle bundle = ResourceBundle.getBundle(basename, locale, cl);
              System.out.println(bundle.getString("foo"));
              

               

              Takayoshi Kimura 様にご教示いただいた方法を参考に、

              ClassLoaderを作成しResourceBundleを試みましたが、

              earの外に配置したプロパティファイルを読み込ませようとしたところ、以下の例外が発生いたしました。

               

              【java.util.MissingResourceException: Can't find bundle for base name test, locale ja_JP】

               

              プロパティファイルをjar化し、ear/libに配置したところ正常に動作いたします。

               

               

              上記の観点から、JBoss AS7においてEARアプリケーションでは、いかなる状況においても
              EAR/lib配下にjar化したプロパティファイルを配置して、リソースバンドルを行うしか方法はないのでは?

              という結論に達しました。

               

               

              私が作成いたしましたクラスローダを掲載致しますので、

              もし、何かお気づきの点がございましたらご教示いただけたらと思います。

               

              ※事前に、/test/config/common/test.propertiesを配置するものとする。

               

              JBoss EARアプリケーション内から、リソースバンドルを行いたいことを前提とする。
              処理は下記コードにて、記述。

               

                 URL configDirURL = new URL("file://test/config/common/");
                URL[] urls = {configDirURL};
                 URLClassLoader cl = URLClassLoader.newInstance(urls,Thread.currentThread().getContextClassLoader());
                 load("test",new Locale("", ""),cl);

               

              以上です。

              よろしくお願い致します。

              • 4. Re: JBoss7.1.0 Finalのプロパティファイルのについて
                Takayoshi Kimura Novice

                上記の観点から、JBoss AS7においてEARアプリケーションでは、いかなる状況においても
                EAR/lib配下にjar化したプロパティファイルを配置して、リソースバンドルを行うしか方法はないのでは?

                という結論に達しました。

                もう少し落ち着きましょう。そんなに大急ぎで結論に達してもあまり良いことないと思いますよ。

                URL configDirURL = new URL("file://test/config/common/");

                スラッシュが一個足りません。fileプロトコルでルートからのパスを示すのであればスラッシュは3個 file:///test... です。

                • 5. Re: JBoss7.1.0 Finalのプロパティファイルのについて
                  nakamura takuya Newbie

                  Takayoshi Kimura様

                   

                  返信ありがとうございます。

                   

                   

                       /test/config/common/test.properties

                       読み込みに成功しました。

                   

                       URL configDirURL = new URL("file:///test/config/common/");
                       URL[] urls = {configDirURL};
                       URLClassLoader cl = URLClassLoader.newInstance(urls,Thread.currentThread().getContextClassLoader());
                       ResourceBundle.Control control = new ResourceBundle.Control() {};
                       resourceBundle = ResourceBundle.getBundle("test",new Locale(""),cl,control);

                   

                   

                   

                   

                  上記のソースで成功いたしました!!

                  結果的に、"/"が足りないだけでした・・・

                  うまくいきました。

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