14

アプリケーションの構成ファイルを読み取るためのベスト プラクティスは何ですか。Tomcat サーバーのどのフォルダーが「クラスパス上」にあるか。

構成ファイルを に配置しようとしましたTOMCAT_HOME\confが、それでもサーブレットから読み取ることができません。

これを使用してみました(confにapp.propertiesファイルがあります):

this.getClass().getClassLoader().getResourceAsStream("/app.properties");

私はおそらく10〜15のプロパティをあまり持っていませんが、これは問題にならないと考えました。jbossを使用していたとき、これはそれほど問題ではなかったのを覚えています。

私のアプリでは、DB接続スプリングも指定しcontext.xmlていますが、そこでプロパティを指定することはできますか? または、これはTomcatでどのように機能しますか?

私は自分のプロパティを自分の戦争/アンパックされた戦争から分離したいと思います.

アップデート

これを尋ねる理由は、自分のアプリがどこにデプロイされるかわからないためです (どの場所に)

4

6 に答える 6

25

さまざまな方法がありますが、ニーズによって異なります。

ディレクトリからプロパティ ファイルをロードするに$TOMCAT_HOME/confは、オブジェクトを使用してアクセスする必要があります。これjava.io.Fileは、クラス ローダーがクラス パス ( 、またはthis.getClass().getClassLoader().getResourceAsStream(...)の下) からファイル (およびクラス) をロードできるためです。WEB-INF/classesWEB-INF/lib$TOMCAT_HOME/lib

Tomcat の config ディレクトリからファイルをロードする最も簡単な例は次のとおりです。

File configDir = new File(System.getProperty("catalina.base"), "conf");
File configFile = new File(configDir, "myconfig.properties");
InputStream stream = new FileInputStream(configFile);
Properties props = new Properties();
props.load(stream);

このアプローチにより、コードが Tomcat に依存するようになることに注意してください (読み込みメカニズムは、Tomcat のシステム プロパティが利用可能であるという事実に依存します)。これはまったくお勧めしませんプロパティ ファイルをクラスパス内のフォルダに移動すると、試した方法でロードでき、アプリケーションを任意のコンテナにデプロイできます。

また、プロパティを JNDI リソースとして構成することもできますが、それらにアクセスするのは面倒です。

于 2012-09-05T12:09:21.820 に答える
2

特定の構成ファイルの場所を参照するのではなく、JNDIバインド構成を使用して、アプリケーションを構成データとJavaEE標準のみに依存させます。私は2つのオプションを見ることができます:

  1. プロパティファイルに適度な数の構成エントリしかない場合は、それらを環境エントリにして、アプリケーションのJNDIを介してアクセスすることを検討してください。

  2. または、プロパティを別のプロパティファイルに保持する場合は、プロパティを表すBean、ファクトリ(プロパティファイルを使用してBeanを初期化する)を作成し、リソース定義としてJNDIに接続することもできます。
    これにより、アプリを再起動したり、さまざまな構成ソースを切り替えたり、その他の同様の要件を設定したりすることなく、プロパティファイルを定期的に再読み込みできる場合もあります。

この構成を使用する各Webアプリケーションには、構成Beanを参照するためのリソース参照web.xml(またはオプション1が使用されている場合は各環境エントリへの参照)を含める必要があります。

于 2012-09-05T12:18:24.747 に答える
1

ファイルを webapp のWEB-INF/classes. これはデフォルトのクラスパス ディレクトリです。confTomcat 内部のみの場合。

于 2012-09-05T12:07:04.590 に答える
0

私の知る限りdatasource、Tomcatでも設定できます。Tomcatのデータソース

この後datasource、アプリケーションで使用できます。

于 2012-09-05T11:54:25.627 に答える
0

PITAなのかもしれませんが、どこに展開されるかわからない機能でもあるでしょう。その場合、その事実に自分自身を「結合」することはできません!

Java スタックの残りの部分にもよりますが、最善の方法は通常、Tomcat に依存しないことです。Spring を使用している場合は、たとえば次のように言えます。

new ClassPathResource("**/myFile.properties")

または Java Config を使用している場合は、別の例:

@PropertySource("classpath:META-INF/MyWeb.properties")

プレーンな Java では、次のように言えます。

InputStream stream = loader.getResourceAsStream(resourceName);

loader は ClassLoader のインスタンスです

于 2012-09-05T12:11:13.670 に答える