私のWebアプリケーションでは、などの事前定義されたユーザーのセットに電子メールを送信する必要がfinance@xyz.com
あるため、それを.properties
ファイルに追加して、必要なときにアクセスしたいと思います。これは正しい手順ですか?正しい場合、どこにこのファイルを配置すればよいですか?ソースとJSPファイル用に2つの別々のフォルダーがあるNetbeans IDEを使用しています。
私のWebアプリケーションでは、などの事前定義されたユーザーのセットに電子メールを送信する必要がfinance@xyz.com
あるため、それを.properties
ファイルに追加して、必要なときにアクセスしたいと思います。これは正しい手順ですか?正しい場合、どこにこのファイルを配置すればよいですか?ソースとJSPファイル用に2つの別々のフォルダーがあるNetbeans IDEを使用しています。
回答:
それはあなたの選択です。Java Webアプリケーションアーカイブ(WAR)には基本的に3つの方法があります。
ClassLoader#getResourceAsStream()
クラスパス相対パスでロードできるように:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
ここではfoo.properties
Webアプリケーション、例えばWebアプリケーションのデフォルトのクラスパスでカバーされている根の一つに置かれることになっている/WEB-INF/lib
と/WEB-INF/classes
、サーバーの/lib
、またはJDK / JREの/lib
。プロパティファイルがwebapp固有である場合、それをに配置するのが最善です/WEB-INF/classes
。IDEで標準のWARプロジェクトを開発している場合は、それをsrc
フォルダー(プロジェクトのソースフォルダー)にドロップします。Mavenプロジェクトを使用している場合は、/main/resources
フォルダーにドロップします。
または、デフォルトのクラスパス以外の場所に配置して、そのパスをアプリサーバーのクラスパスに追加することもできます。たとえばTomcatでは、のshared.loader
プロパティとして構成できます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アプリケーションからオーバーライドできるようにすることもできます。
これServletContext#getResourceAsStream()
で、webcontent相対パスを使用してロードできます。
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
私はファイルを/WEB-INF
フォルダーに配置することを実証したことに注意してください。またことに注意してServletContext
いずれかであるHttpServlet
クラス継承でわずかアクセス可能GenericServlet#getServletContext()
と中Filter
によりますFilterConfig#getServletContext()
。サーブレットクラスに属していない場合、通常はを介して単に注入でき@Inject
ます。
java.io
絶対ローカルディスクファイルシステムパスで通常の方法でロードできるように:
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
絶対パスを使用することの重要性に注意してください。相対ローカルディスクファイルシステムのパスは、Java EE Webアプリケーションでは絶対に必要です。以下の最初の「関連項目」リンクも参照してください。
保守性については、自分の長所と短所を比較検討してください。
プロパティファイルが「静的」であり、実行時に変更する必要がない場合は、WARに保持できます。
毎回WARを再ビルドおよび再デプロイする必要なしにWebアプリケーションの外部からプロパティファイルを編集できるようにしたい場合は、プロジェクトの外部のクラスパスに配置します(必要な場合は、クラスパスにディレクトリを追加します)。
Properties#store()
メソッドを使用してWebアプリケーションの内部からプログラムでプロパティファイルを編集できるようにする場合は、Webアプリケーションの外部に配置します。にはProperties#store()
が必要なWriter
ので、ディスクファイルシステムのパスを使用して回避することはできません。そのパスは、VM引数またはシステムプロパティとしてWebアプリケーションに渡されます。念のため、は絶対に使用しないでgetRealPath()
ください。変更が元のWARファイルに反映されないという単純な理由で、デプロイフォルダ内のすべての変更は再デプロイ時に失われます。
/etc/appconfs
ます)2)そのフォルダーをアプリサーバー/ドメインのクラスパスに追加します。2番目のステップはアプリサーバー固有です。その一般的な例はないと思います。
"WEB-INF/filename.properties"
と"/WEB-INF/filename.properties"
(/
冒頭に注意)の両方が機能するのですか?どちらか一方を優先する理由はありますか?
警告の言葉:設定ファイルをWEB-INF/classes
フォルダーに入れ、IDE(たとえばEclipse)がクリーン/再構築を行うと、Javaソースディレクトリにない限り、confファイルが破壊されます。BalusCの素晴らしい答えは、オプション1のそれを暗示していますが、私は強調を加えたかったのです。
私は、EclipseでWebプロジェクトを「コピー」すると、ソースフォルダーからクリーンアップ/再構築を行うという難しい方法を学びました。私の場合、POJO Javaライブラリから「リンクされたソースディレクトリ」を追加した場合、それはWEB-INF/classes
フォルダーにコンパイルされます。そのプロジェクト(Webアプリプロジェクトではない)でクリーンアップ/再構築を行うと、同じ問題が発生しました。
confをPOJO srcフォルダーに入れることを考えましたが、これらのconfはすべて、フォルダー内にあるサードパーティライブラリ(QuartzやURLRewriteなど)のWEB-INF/lib
ためのものであり、意味がありませんでした。私はそれに移動したときに、Webプロジェクトの "src"フォルダーに配置することをテストする予定ですが、そのフォルダーは現在空であり、confファイルが含まれているように見えません。
中のconfファイルを置くためのI投票のでWEB-INF/commonConfFolder/filename.properties
、次の Balusオプション2であるclassesフォルダに。
例: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の下にあることを確認してください)。
コードがapp.propertiesなどのファイルを探しているとします。tomcatのbinディレクトリにsetenv.shを作成して、このファイルを任意のディレクトリにコピーし、このディレクトリをクラスパスに追加します。
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