私のWebアプリケーションでは、のような事前定義されたユーザーのセットに電子メールを送信する必要があるため、それをファイルfinance@xyz.com
に追加し、必要に応じてアクセスしたいと思います。.properties
これは正しい手順ですか?そうであれば、このファイルをどこに配置すればよいですか?ソースファイルとJSPファイル用に2つの別々のフォルダがあるNetbeansIDEを使用しています。
6 に答える
それはあなたの選択です。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
なクラスにあることにも注意してください。サーブレットクラスに属していない場合は、通常、を介して注入できます。HttpServlet
GenericServlet#getServletContext()
Filter
FilterConfig#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ファイルに反映されないという単純な理由で、再デプロイ時に失われます。
参照:
警告の言葉:設定ファイルを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です。
例: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.
クラスパスに含まれている必要があります(ビルドの一部として、.warの/ WEB-INF / classesの下にあることを確認してください)。
ソースフォルダを使用できるので、ビルドするたびに、それらのファイルが自動的にclassesディレクトリにコピーされます。
プロパティファイルを使用する代わりに、XMLファイルを使用してください。
データが小さすぎる場合は、web.xmlを使用してプロパティにアクセスすることもできます。
これらのアプローチでは、変更を反映するためにアプリサーバーを再起動する必要があることに注意してください。
コードが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