Webアプリケーション(WAR)を作成し、Tomcatにデプロイします。 webappには、管理者が設定データを入力できるフォームのページがあります。このデータをDBMSに保存するのではなく、ファイルシステム上のXMLファイルにのみ保存します。どこに置きますか?
アプリケーション自体がデプロイされているディレクトリツリーのどこかにファイルを配置したいと思います。設定ファイルはWEB-INFディレクトリにあるべきですか?それとも別の場所に置きますか?
ディレクトリの絶対パスを見つけるためにサーブレットで使用するJavaコードは何ですか?または相対パスでアクセスできますか?
サーバー上の別のディレクトリに配置します(/ config、/ opt/config、/ root/config、/ home/username/config、または必要なものを使用できます)。サーブレットが起動すると、XMLファイルを読み取り、そこからいくつかのもの(最も重要なのはDB接続情報)を取得します。
なぜこれをやったのかと尋ねました。
すべてをDBに保存するのは良いことですが、明らかにDB接続情報をDBに保存することはできません。
コード内でハードコーディングすることもできますが、それは多くの理由で見苦しいです。情報を変更する必要がある場合は、コードを再構築して再デプロイする必要があります。誰かがあなたのコードまたはWARファイルのコピーを入手した場合、その情報を入手します。
WARファイルに物事を入れるのはいいように思えますが、物事を多く変えたい場合は、悪い考えかもしれません。問題は、情報を変更する必要がある場合、次に再デプロイするときにファイルが上書きされるため、WARに組み込まれているバージョンで変更を覚えていなかったものはすべて忘れられることです。
ファイルシステムの特定の場所にあるファイルは、私たちにとって非常にうまく機能します。大きな欠点はありません。別々の場所に格納されているため、複数のマシンに異なる構成値が必要な場合は、WARの一部ではないため、複数のマシンへのデプロイが容易になります。
私がそれがうまくいくと考えることができる他の唯一の解決策は、DBログイン情報以外のすべてをDBに保持することです。これは、JVMを介して取得されるシステムプロパティJavaから得られます。これは、上記のHans Doggenが言及したPreferences APIのことです。アプリケーションが最初に開発されたときは、それは使われなかった。
構成ファイルにアクセスするためのパスについては、ファイルシステム上の単なるファイルです。 Webパスについて心配する必要はありません。したがって、サーブレットが起動すると、「/ config/myapp/config.xml」(または何でも)にあるファイルを開くだけで、正しいものが見つかります。このためにパスをハードコーディングするだけで、私にはまったく無害に思えます。
WEB-INFは、構成ファイルを置くのに適した場所です。サーブレットからディレクトリの絶対パスを取得するコードを次に示します。
public void init(ServletConfig servletConfig) throws ServletException{
super.init(servletConfig);
String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
WEB-INF
に配置すると、URLから直接アクセスしようとするユーザーからXMLファイルが非表示になるため、はい、WEB-INF
に配置すると言います。
アプリケーションの新しい展開で構成を上書きするため、アプリケーションフォルダーに保存しません。
Preferences APIをご覧になるか、usersフォルダー(Tomcatを実行しているユーザー)に何かを書くことをお勧めします。
これに対する答えは、その構成ファイルをどのように読み書きするかによって異なります。
たとえば、Springフレームワークでは、XML構成ファイルを使用する(またはJavaプロパティファイル);クラスパス(例:WEB-INFディレクトリ)、ファイルシステムの他の場所、またはメモリに保存できます。このためにSpringを使用する場合、設定ファイルを保存する最も簡単な場所はWEBです-INFディレクトリ、およびSpringの ClassPathXmlApplicationContext クラスを使用して、構成ファイルにアクセスします。
ただし、これもすべて、そのファイルへのアクセス方法によって異なります。
カスタム設定の場合は、WEB-INFが適切な場所です。ただし、一部のライブラリでは、設定がWEB-INF/classesに存在する必要があります。