2011-08-16 24 views
2

最近、私のコアサーブレットアプリケーションのコア機能をjarファイルに分けました。このjarファイルはtomcatのlibフォルダにデプロイされ、アプリケーション(つまり、サーブレット、jsp、プロパティファイルなど)はwarファイルとして独立して配備されます。tomcatのlibのjarがWebアプリケーション内のプロパティファイルを参照できません

jarファイルには特定のプロパティファイルが必要です。これらのプロパティファイルは、warファイル内の「src」フォルダ(クラス階層の最上位)のすぐ下に配置します。

過去にすべてが同じプロジェクトにあって、1つのwarファイルにデプロイされたとき。プロパティファイルは、関連するクラスからアクセス可能でした。これらのクラスがjarにデプロイされると、warファイルに配置されたプロパティファイル(デプロイされたWebアプリケーション)を見ることができません。

私はここで何が欠けていますか? 私はproeprtiesファイルをロードする方法の例:

properties.load(getClass().getResourceAsStream("/appconfig.properties")); 

はお時間をいただき、ありがとうございます。

答えて

8

クラス独自のクラスローダーでは取得しないでください。クラスは現在Tomcatによって管理されているため、Webアプリケーション固有のリソースではなく、Tomcatの内部リソースのみを知っています。現在のスレッドのコンテキストクラスローダーによって取得する必要があります。そのクラスローダは、現在のWebアプリケーション専用のすべてのリソースを知っています。

properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("appconfig.properties")); 

これに関係なく、グローバルアプリケーション設定を表すこのようなプロパティファイルの適切な場所は、WARファイル内にはありません。 TomcatとWARファイルの外側の固定パスにプロパティファイルを置き、その固定パスをTomcatの/conf/catalina.propertiesのプロパティのshared.loaderに追加して、クラスパスの一部にする必要があります。これにより、WAR全体を再構築/再デプロイする必要なしに、コンフィギュレーションファイルを自由に編集することができます。 まだは、コンテキストクラスローダーを使用してロードする必要があることに注意してください。

1

はい、tomcat libフォルダのjarファイルが、Webアプリケーションのクラスについて何も知らない別のクラスローダによって読み込まれるため、動作しません。言い換えれば、tomcat libはwebappクラスローダの親クラスローダです(webappごとに作成されます)。

プロパティファイルを外部の場所に置き、絶対ファイルパス経由でtomcat lib内のjarファイルに知らせるか、jarファイルをwebappのlibディレクトリに戻すことができます。

ここに、Tomcatサイトの参考資料があります。

http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html

典型的には、環境変数は絶対パスをハードコーディングを避けるために、相対ファイルパスに前置される$ CATALINA_HOMEを識別するために使用されます。

String catalinaHome = System.getProperty("CATALINA_HOME"); 
properties.load(new FileInputStream(new File(catalinaHome + "/path/to/appconfig.properties"))); 
関連する問題