228

私のWebアプリケーションでは、のような事前定義されたユーザーのセットに電子メールを送信する必要があるため、それをファイルfinance@xyz.comに追加し、必要に応じてアクセスしたいと思います。.propertiesこれは正しい手順ですか?そうであれば、このファイルをどこに配置すればよいですか?ソースファイルとJSPファイル用に2つの別々のフォルダがあるNetbeansIDEを使用しています。

4

6 に答える 6

474

それはあなたの選択です。Java Webアプリケーションアーカイブ(WAR)には、基本的に3つの方法があります。


1.クラスパスに入れます

ClassLoader#getResourceAsStream()クラスパス相対パスを使用してロードできるようにするには、次のようにします。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);

foo.propertiesこれは、Webアプリケーションのデフォルトのクラスパスでカバーされるルートの1つに配置されることになっています。たとえば、 Webアプリケーション/WEB-INF/lib/WEB-INF/classes、サーバー/lib、またはJDK/JRE/libです。プロパティファイルがwebapp固有の場合は、に配置するのが最適です/WEB-INF/classes。IDEで標準のWARプロジェクトを開発している場合は、それをsrcフォルダー(プロジェクトのソースフォルダー)にドロップします。Mavenプロジェクトを使用している場合は、/main/resourcesフォルダーにドロップします。

または、デフォルトのクラスパスの外に配置して、そのパスをappserverのクラスパスに追加することもできます。shared.loaderたとえばTomcatでは、のプロパティとして設定できますTomcat/conf/catalina.properties

foo.propertiesのようなJavaパッケージ構造に配置した場合はcom.example、以下のようにロードする必要があります。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...

コンテキストクラスローダーのこのパスは、で始まるべきではないことに注意してください/。のような「相対的な」クラスローダーを使用している場合にのみ、SomeClass.class.getClassLoader()実際に。で開始する必要があります/

ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...

ただし、プロパティファイルの可視性は、問題のクラスローダーによって異なります。これは、クラスをロードしたものと同じクラスローダーにのみ表示されます。したがって、クラスがたとえばwebappクラスローダーではなくサーバー共通クラスローダーによってロードされ、プロパティファイルがwebapp自体の内部にある場合、そのクラスは表示されません。コンテキストクラスローダーが最も安全な方法であるため、プロパティファイルをクラスパスの「どこにでも」配置したり、サーバーが提供するファイルをWebアプリからオーバーライドしたりすることができます。


2.ウェブコンテンツに入れます

ServletContext#getResourceAsStream()これにより、webcontent-relativeパスを使用してロードできます。

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...

ファイルを/WEB-INFフォルダに配置することを示したことに注意してください。そうしないと、Webブラウザから一般にアクセス可能になってしまいます。また、は継承されたものとによってアクセス可能ServletContextなクラスにあることにも注意してください。サーブレットクラスに属していない場合は、通常、を介して注入できます。HttpServletGenericServlet#getServletContext()FilterFilterConfig#getServletContext()@Inject


3.ローカルディスクファイルシステムに配置します

java.io絶対ローカルディスクファイルシステムパスを使用して通常の方法でロードできるようにするには、次のようにします。

InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...

絶対パスを使用することの重要性に注意してください。相対的なローカルディスクファイルシステムパスは、JavaEEWebアプリケーションでは絶対に使用できません。以下の最初の「関連項目」リンクも参照してください。


どちらを選択しますか?

保守性についてのあなた自身の意見で、長所と短所を比較検討してください。

プロパティファイルが「静的」であり、実行時に変更する必要がない場合は、それらをWARに保持できます。

毎回WARを再構築して再デプロイすることなく、Webアプリケーションの外部からプロパティファイルを編集できるようにしたい場合は、プロジェクトの外部のクラスパスに配置します(必要に応じてディレクトリをクラスパスに追加します)。

メソッドを使用してWebアプリケーションの内部からプログラムでプロパティファイルを編集できるようにする場合はProperties#store()、Webアプリケーションの外部に配置します。がProperties#store()必要なためWriter、ディスクファイルシステムパスを使用して回避することはできません。そのパスは、VM引数またはシステムプロパティとしてWebアプリケーションに渡すことができます。予防措置として、絶対に使用しないgetRealPath()でください。デプロイフォルダー内のすべての変更は、変更が元のWARファイルに反映されないという単純な理由で、再デプロイ時に失われます。

参照:

于 2010-01-29T11:36:17.023 に答える
10

警告の言葉:設定ファイルをWEB-INF/classesフォルダに入れ、IDE、たとえばEclipseがクリーン/再構築を行うと、Javaソースディレクトリにない限り、confファイルが削除されます。BalusCの素晴らしい答えは、オプション1でそれをほのめかしていますが、強調したいと思います。

EclipseでWebプロジェクトを「コピー」すると、任意のソースフォルダーからクリーン/再構築が行われるという難しい方法を学びました。私の場合、POJO Javaライブラリから「リンクされたソースディレクトリ」を追加すると、WEB-INF/classesフォルダにコンパイルされます。そのプロジェクト(Webアプリプロジェクトではない)でクリーンアップ/再構築を実行すると、同じ問題が発生しました。

confをPOJOsrcフォルダーに配置することを考えましたが、これらのconfはすべて、フォルダー内にあるサードパーティのライブラリ(QuartzやURLRewriteなど)用であるWEB-INF/libため、意味がありませんでした。Webプロジェクトの「src」フォルダーに移動してテストする予定ですが、そのフォルダーは現在空であり、confファイルが含まれているのはエレガントではないようです。

WEB-INF/commonConfFolder/filename.propertiesそこで、私はconfファイルをclassesフォルダーのに置くことに投票します。これはBalusオプション2です。

于 2014-06-19T16:08:09.657 に答える
6

例:web.xmlファイルでタグ

<context-param>
        <param-name>chatpropertyfile</param-name>
        <!--  Name of the chat properties file. It contains the name and description                   of rooms.-->     
        <param-value>chat.properties</param-value>
    </context-param>

そしてchat.propertiesあなたはこのようにあなたのプロパティを宣言することができます

例の場合:

Jsp = Discussion about JSP can be made here.
Java = Talk about java and related technologies like J2EE.
ASP = Discuss about Active Server Pages related technologies like VBScript and JScript etc.
Web_Designing = Any discussion related to HTML, JavaScript, DHTML etc.
StartUp = Startup chat room. Chatter is added to this after he logs in.
于 2012-08-15T08:08:20.700 に答える
5

クラスパスに含まれている必要があります(ビルドの一部として、.warの/ WEB-INF / classesの下にあることを確認してください)。

于 2010-01-29T09:47:43.823 に答える
3

ソースフォルダを使用できるので、ビルドするたびに、それらのファイルが自動的にclassesディレクトリにコピーされます。

プロパティファイルを使用する代わりに、XMLファイルを使用してください。

データが小さすぎる場合は、web.xmlを使用してプロパティにアクセスすることもできます。

これらのアプローチでは、変更を反映するためにアプリサーバーを再起動する必要があることに注意してください。

于 2010-01-29T09:53:55.177 に答える
2

コードがapp.propertiesというファイルを探していると仮定します。このファイルを任意のdirにコピーし、tomcatのbin dirにsetenv.shを作成して、このdirをクラスパスに追加します。

tomcatのsetenv.sh(このファイルが存在しない場合は作成します。tomcatはこのsetenv.shファイルをロードします。 #!/bin/sh CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"

./webapps//WEB-INF/classes/app.propertiesにプロパティファイルを配置しないでください

Tomcatクラスローダーは、WEB-INF /classes/からのものでオーバーライドします

良い読み物: https ://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

于 2018-10-04T19:36:52.947 に答える