質問: サービスベースのアプリケーションで、配置場所と配置リソースファイルの読み方 私のwebアプリケーションでは、finance@xyz.comのような一連の定義済みユーザーにeメールを送信する必要があるので、それを.propertiesファイルに追加して、必要に応じてアクセスします。これは正しい手順ですか?正しい場合は、このファイルをどこに配置すればよいですか? netbeans ideを使用しています。これには、ソースファイルとjspファイル用に2つの別々のフォルダーがあります。
回答: それはあなたの選択です。 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。 propertiesファイルがwebアプリケーション固有のものである場合は、それを/web-inf/classesに配置することをお勧めします。 ideで標準のwarプロジェクトを開発している場合は、それをsrcフォルダー(プロジェクトのソースフォルダー)にドロップします。 mavenプロジェクトを使用している場合は、それを/main/resourcesフォルダーにドロップします。あるいは、デフォルトのクラスパスの外側に配置して、そのパスをアプリケーションサーバーのクラスパスに追加することもできます。たとえばtomcatでは、shared.loaderのtomcat/conf/catalina.propertiesプロパティとして設定できます。foo.propertiesをcom.exampleのようなjavaパッケージ構造に配置した場合は、次のようにロードする必要があります。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"); // ... ただし、プロパティファイルの可視性は、問題のクラスローダによって異なります。クラスをロードしたものと同じクラスローダーからしか見えません。それで、クラスが例えばによってロードされるならば。 webアプリケーションのクラスローダーの代わりにサーバーの共通のクラスローダーがあり、プロパティファイルがwebアプリケーション自体の中にある場合は見えません。コンテキストクラスローダーが最も安全な方法です。そのため、プロパティファイルをクラスパスの「どこにでも」配置することができます。または、webアプリケーションからサーバー提供のものをオーバーライドできるようにすることもできます。2. webcontentに入れますwebcontentからの相対パスを指定して servletcontext#getresourceasstream() で読み込むことができます。inputstream input = getservletcontext().getresourceasstream("/web-inf/foo.properties"); // ... 私は/web-infフォルダにファイルを置くことを実証したことに注意してください、そうでなければそれはどのウェブブラウザからでも一般にアクセス可能であったでしょう。また、servletcontextは継承された genericservlet#getservletcontext() によってアクセス可能なhttpservletクラスにあり、filterには filterconfig#getservletcontext() によってアクセス可能です。サーブレットクラスに入っていない場合は、通常@injectを介して注入するだけです。3.ローカルディスクファイルシステムに置く絶対ローカルディスクファイルシステムのパスを使って通常のjava.ioの方法で読み込むことができます。inputstream input = new fileinputstream("/absolute/path/to/foo.properties"); // ... 絶対パスを使用することの重要性に注意してください。相対ローカルディスクファイルシステムパスは、java ee webアプリケーションでは絶対に使用できません。下記の最初の "see also"リンクも参照してください。どちらを選ぶ?your独自の保守容易性についての長所と短所を比較してください。プロパティファイルが「静的」で実行時に変更する必要がない場合は、それらをwarに保存することができます。毎回warを再構築して再デプロイする必要なしにwebアプリケーションの外部からプロパティファイルを編集できる場合は、プロジェクトの外部のクラスパスに配置します(必要に応じて、ディレクトリをクラスパスに追加します)。properties#store()メソッドを使用してwebアプリケーションの内部からプログラムでプロパティファイルを編集できるようにしたい場合は、webアプリケーションの外部に配置します。 properties#store()にはwriterが必要なので、ディスクファイルシステムのパスを使って移動することはできません。そのパスは、webアプリケーションにvm引数またはシステムプロパティとして渡すことができます。念のため、 は絶対にgetrealpath() を使用しないでください。展開フォルダ内のすべての変更は、変更が元のwarファイルに反映されないという単純な理由で、再展開時に失われます。また見なさい: getresourceasstream()vs fileinputstream tomcatクラスパスにディレクトリを追加する プログラムによるjsfアプリケーションのプロパティファイルへのアクセス