2009-05-26 3 views
3

私の問題は、あなたが非常に一般的だと思う問題ですが、これまでソリューションを見つけることができませんでした。ClassLoaderメソッドを使用して、クラス内のすべてのリソースを入力ストリームとして取得します。

Tomcat 5.5の下でJava Webアプリケーションをビルドします(ただし、WebLogic環境のようにどこにでもデプロイできるという要件があります)。リソースファイルは、WEB-INF/classesの下に配置され、ClassLoaderのgetResourceAsStream()メソッドを使用してロードされていることが賢明です。あなたがロードしたいリソースの名前を知っていれば、大丈夫です。

私の問題は、クラスのサブディレクトリにあるすべてのもの(空でないサブディレクトリに再帰的に含む)をロードする必要があることです。

folderX/folderY

folderX/folderY/fileA.properties

:私が持っている場合

ので、例えば、WEB-INF /クラスの下に、次のfolderX/fileB.properties

ファイルが必要ですロードするA.propertiesクラスとfileB.propertiesクラスを、アプリケーションが起動する前に実際に名前を知らなくても(つまり、WEB-INF/classesの下の任意のディレクトリからリソースを任意にロードする必要がある)

これを行う最もエレガントな方法は何ですか?必要な情報(それぞれの必要なリソースへのリソースパス)を見つけるために、どのようなオブジェクトを調べることができますか?可能であれば、サーブレット以外の特定のソリューションがベストです(可能であればクラスローディングフレームワーク内にすべて保持してください)。

ありがとうございます!

答えて

1

あなたは、いくつかのトリック:)

とプロトコルを抽出し、URLなどのリソースを取得することを行うことができます。

  • ファイルプロトコル - URLのパスを取得し、フォルダを持っている、ファイルをスキャン。
  • jar/zip protocol - jar/zipパスを抽出し、JarFileを使用してファイルをブラウズし、パス/パッケージの下のすべてを抽出します。
+0

ウェブサーバーが自分自身を指し示すhttpプロトコルを返すことはできませんでしたか?私は少なくとも、このようなアプローチは、すべてのターゲットWebサーバー上でテストして、動作することを確認する必要があります。 – Yishai

+0

Sun Jersey REST実装では、このアプローチを使用して、パッケージ名に基づいて特定のクラスを検索します(特定の注釈を持つクラスを探す)。 –

+0

展開されていないWARデプロイメントに関するWebLogicの制限事項について教えてください。 Fileオブジェクトをインスタンス化して調べると、WebLogicでは問題が発生しませんか? – ubermensch

2

私が知る限り、クラスローダーは要求されたものだけを読み込もうとするので、そのような能力はありません。クラスパス上のすべての項目をプリフェッチしたり、ディレクトリ構造として扱いません。

私が問題を解決する方法は、ビルド時にすべての関連リソースのテキストファイルにディレクトリリストを作成し、それを戦争に組み込み、その方法でそれを実行します。

関連する問題