GNU/Linux >> Linux の 問題 >  >> Linux

.war ファイルからの Tomcat webapp 構成の外部化

.propertiesが好きです

の代わりにファイル
  • JNDI - プログラム構成中に複雑なオブジェクトを構築する理由 初期化時間の代わりに?
  • システム プロパティ - 単一の Tomcat で同じ WAR の複数のインスタンスを個別に構成することはできません
  • コンテキスト パラメータ - javax.servlet.Filter でのみアクセス可能 、 javax.servlet.ServletContextListener 不便です

Tomcat 7 コンテキスト保持ローダー要素。 docs デプロイメント記述子によると (<Context> の内容) タグ) は次の場所に配置できます:

  • $CATALINA_BASE/conf/server.xml - 悪い - 構成を再読み込みするにはサーバーの再起動が必要
  • $CATALINA_BASE/conf/context.xml - 悪い - すべてのアプリケーションで共有
  • $CATALINA_BASE/work/$APP.war:/META-INF/context.xml - 悪い - 構成を変更するには再パッケージが必要
  • $CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml - いいね 、ただし最後のオプションを参照してください!!
  • $CATALINA_BASE/webapps/$APP/META-INF/context.xml - いいね 、ただし最後のオプションを参照してください!!
  • $CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml - 最高 - アプリケーションから完全に除外され、自動的に変更がスキャンされます!!!

Context カスタム Loader を保持できます org.apache.catalina.loader.VirtualWebappLoader (最新の Tomcat 7 で利用可能。独自のクラスパスを追加できます) あなたの .properties に )、および Parameter (FilterConfig.getServletContext().getInitParameter(name) 経由でアクセス ) と Environment (new InitialContext().lookup("java:comp/env").lookup("name") 経由でアクセス ):

<Context docBase="${basedir}/src/main/webapp"
         reloadable="true">
    <!-- http://tomcat.apache.org/tomcat-7.0-doc/config/context.html -->
    <Resources className="org.apache.naming.resources.VirtualDirContext"
               extraResourcePaths="/WEB-INF/classes=${basedir}/target/classes,/WEB-INF/lib=${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
            virtualClasspath="${basedir}/target/classes;${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <JarScanner scanAllDirectories="true"/>

    <Parameter name="min" value="dev"/>
    <Environment name="app.devel.ldap" value="USER" type="java.lang.String" override="true"/>
    <Environment name="app.devel.permitAll" value="true" type="java.lang.String" override="true"/>
</Context>

Spring を使用し、それが XML 構成である場合:

<context:property-placeholder location="classpath:app.properties"/>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@${db.host}:${db.port}:${db.user}"/>
    <property name="username" value="${db.user}"/>
    <property name="password" value="${db.pass}"/>
</bean>

Spring を使用すると、上記のプロパティを Bean フィールドに簡単に注入できます:

@Value("${db.user}") String defaultSchema;

JNDI の代わり:

@Inject ApplicationContext context;
Enviroment env = context.getEnvironment();
String defaultSchema = env.getProperty("db.user");

EL がこれを許可することにも注意してください (デフォルト値と深い再帰的置換):

@Value('${db.user:testdb}') private String dbUserName;

<property name='username' value='${db.user.${env}}'/>

こちらもご覧ください:

  • Tomcat クラスパスへのディレクトリの追加
  • Tomcat でアプリケーションごとにカスタム クラスパスを作成できますか
  • Tomcat で webapp コンテキスト外のプロパティ ファイルを読み取る方法
  • プロパティ ファイルを使用して DB 接続情報をロードするように Tomcat を構成する
  • server.xml または context.xml でデータベース接続プロパティを設定する必要があります
  • Tomcat 構成の外部化

注意 クラスパスをライブ ディレクトリに拡張することで、他の構成を外部化することもできます 、logging、auth、atc など。私は logback.xml を駆除します

更新 <Resources> の Tomcat 8 変更構文 と <Loader> 要素、対応する部分は次のようになります:

<Resources>
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/classes" base="${basedir}/target/classes" />
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/lib" base="${basedir}/target/${project.build.finalName}/WEB-INF/lib" />
</Resources>

あなたの tomcat/conf/Catalina/<host> Java から JNDI 経由でアクセスできる「環境エントリ」の定義など、多くの設定を可能にするコンテキスト記述子を含めることができます。それを使用する方法はたくさんあります。個人的には、プロパティ ファイルへのファイル システム パスである環境エントリを設定します。私のアプリはこのエントリをチェックするように構築されており、存在しない場合は、代わりにクラスパスでファイルを探します。そうすれば、dev ではクラスパス上に dev プロパティがありますが、ビルドしてデプロイするときは、それを外部ファイルにポイントします。

Tomcat の Web サイトには、コンテキストを構成するための優れたドキュメントがあります。 コンテキストの定義を参照してください ファイルの作成方法とその配置場所の詳細に関するセクション。

例として、ホストの名前が myHost の場合 アプリは myApp.war という名前の war ファイルです webapps で ディレクトリであれば、tomcat/conf/Catalina/myHost/myApp.xml を作成できます この内容で:

<Context>
    <Environment name="configurationPath" value="/home/tomcat/myApp.properties" type="java.lang.String"/>
</Context>

次に、コードから java:comp/env/configurationPath で JNDI ルックアップを実行します。 (ここでは 95% の確実性) その文字列値を取得します。


設定 (プロパティ ファイル) を JAR ファイルの Apache Tomcat\lib に配置して、Web アプリケーションから削除することができます。 Tomcat のクラス ローダーが webapp で設定を見つけられない場合、「lib」ディレクトリで見つけようとします。そのため、構成をグローバル lib ディレクトリに移動するだけで、構成を外部化できます (他の Web アプリケーション間で共有されます)。


Linux
  1. tcpdumpのフィルタリング:カオスからの順序の作成

  2. Lsに出力のバイナリからスクリプトを区別させますか?

  3. Utf-8ファイルからBOMを削除する方法は?

  1. Awkからファイルをキャットする方法は?

  2. 別の行からのAWK?

  3. ファイルからテキスト読み取りデータを作成しますか?

  1. ファイルからGrepパターンを読み取る?

  2. C でファイル記述子からファイル名を取得する

  3. アセンブリ内のファイルからの読み取り