を配置する場所と読めるように構成でリソースファイルにサーブレットに基づく利用していますか?
-
23-09-2019 - |
質問
私のweb出願していますメール送信設定の定義済みユーザーのように finance@xyz.com
, でいることができたことを付記する。、 .properties
ファイルにアクセスするときに必要です。この正しい手続きする場合には、その後はどこにすればよい場所にこのファイルとは何ですか?私を使用IDEる二つの別々のフォルダのソースおよびJSPファイルです。
解決
これから足し算をします。基本的には三つの方法でJavaによるwebアーカイブ(戦争):
1.それをクラスパス
できるように荷重で ClassLoader#getResourceAsStream()
るclasspathの相対パス:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
こちらの foo.properties
あの作品が展示されているルーツにおいてデフォルトのクラスパスのウエブアプなどwebappの /WEB-INF/lib
や /WEB-INF/classes
, サーバの /lib
, は、JDK/JREの /lib
.場合にはpropertiesfileはwebapp定に最適で /WEB-INF/classes
.だ開発標準の戦プロジェクトIDEについて教えてください src
フォルダをプロジェクトのソースフォルダ).使用している場合は、Mavenプロジェクト、ドロップで /main/resources
フォルダにまとめた。
すが日本でも入れ以外のところデフォルトクラスパスに追加し、そのパスのクラスパスのappserver.たとえば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クラスローダのプロパティファイルはウエブアプそのもの、それを見えなくしてしまいます。コンテキストクラスローダが安全ベットできますので、プロパティファイルの"もの"のクラスパスおよび/またはすきのオーバーライド、サーバの提供から、ウエブアプです。
2.でwebcontent
できるように荷重で ServletContext#getResourceAsStream()
とwebcontent-相対パス:
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
ご注意いたのファイル /WEB-INF
フォルダにい公共アクセスの他のブラウザ.また、 ServletContext
は HttpServlet
クラスだけがアクセスを継承 GenericServlet#getServletContext()
や Filter
による FilterConfig#getServletContext()
.場合は、サーブレットクラスでは、通常で注射液によ @Inject
.
3.それをローカルディスクにファイルシステム
できるように負荷が通常の java.io
う絶対的なローカルディスクにファイルシステムのパス:
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
重要なの絶対パスです。相対的なローカルディスクにファイルシステムのパスは絶対ないとしての価値はもちろんのこと、Java EEサポートも組み込まれています。見るもの"参照"にリンクします。
選択する?
だけの量の利点に ご 自分の意見を言うの繋がります
の場合はプロパティファイルは"静"なニーズ変更時のランタイム時において、そ用意していますので、そちらの戦争。
希望の場合はできるの編集プロパティファイルからの外部ウェブアプリケーションの再構築や再戦争の時に、このクラスパス外でのプロジェクト(必要な場合には追加のディレクトリのクラスパス).
希望の場合はできるedit propertiesファイルのプログラムに内側からウェブアプリケーションを使用 Properties#store()
方法、それ以外のサポートも組み込まれています。としての Properties#store()
が必要で Writer
, いの周りをディスクファイルシステムのパスです。そのパスができ渡され、ウェブアプリケーションとしてのVM引数またはシステムの物件です。として保 ない 使用 getRealPath()
.すべての変化の展開フォルダのままに再配置のためのシンプルな理由に変更はないが反射して戻ってしまうオリジナルWARファイルです。
参照:
他のヒント
警告の言葉:あなたはWEB-INF/classes
フォルダに設定ファイルを入れて、あなたのIDE場合は、Eclipseを言って、クリーン/彼らはJavaのソースディレクトリにあった場合を除き、それはあなたのconfファイルをNukeのだろう、再構築しません。 BalusCの偉大な答えはオプション1とほのめかしているが、私は強調を追加したい。
私はあなたがEclipseでWebプロジェクトを「コピー」ならば、それはきれいにしないこと、ハードな方法を学んだ/任意のソースフォルダから再構築します。私の場合は、当社のPOJOのJavaライブラリから「リンクされたソースディレクトリ」を追加した、それはWEB-INF/classes
フォルダにコンパイルします。クリーン/そのプロジェクトに再構築(ないWebアプリケーションプロジェクト)を実行すると、同じ問題を引き起こしました。
私はPOJO SRCフォルダに私の会議通話数を置くことについて考えたが、これらの会議通話数は意味がありませんでしたように、WEB-INF/lib
フォルダにある(石英またはURLRewriteなど)サードパーティ製のlibsのすべてです。私はそれに動き回るとき、私は、Webプロジェクト「SRC」フォルダに入れてテストを計画するが、そのフォルダは、現在、空にして、その中のconfファイルを有する洗練思われます。
WEB-INF/commonConfFolder/filename.properties
でのconfファイルを置くためのだから私の投票、のの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.
それはちょうど(別名、それはビルドの一部として、下/ WEB-INF / .warファイル内のクラスを終わることを確認してください)。
クラスパスにする必要がありますあなたが構築するたびので、あなたのソースフォルダとあなた、それらのファイルは自動的にclassesディレクトリにコピーされていることができます。
代わりに、プロパティファイル、使用のXMLファイルを使用しての
データが小さすぎると、あなたもプロパティにアクセスするためのweb.xmlを使用することができます。
してくださいこれらのアプローチのいずれかが反映される変更のためのアプリケーションサーバーの再起動が必要になりますのでご注意ます。
あなたのコードは、ファイルと言うのapp.propertiesを探していると仮定します。任意のディレクトリにこのファイルをコピーし、Tomcatののbinディレクトリにあるsetenv.shを作成することによって、クラスパスにこのディレクトリを追加します。
Tomcatのあなたのsetenv.shで(このファイルは1を作成し、既存のされていない場合、Tomcatはこのsetenv.shファイルをロードします。
#!/bin/sh
CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"
あなたは./webapps//WEB-INF/classes/app.properties
であなたのプロパティファイルを持つべきではありませんはTomcatのクラスローダは、WEB-INFから1で上書きします/クラス/
良いの読み取り: https://tomcat.apache.org/tomcat-8.0- DOC /クラスローダーhowto.htmlする