web-dev-qa-db-ja.com

.warファイルからTomcat webapp設定を外部化する

Tomcat 7でwebappの設定に問題があります。私のWARファイルには、プロパティファイルmyApp/WEB-INF/classes/myProps.propsがあり、環境固有のプロパティが含まれています。同じWARファイルが複数の環境にデプロイされるように、サーバー上のその構成ファイルをオーバーライドしようとしています。

Tomcat/conf/Catalina/myAppの置換設定ファイルを使用してこれを行う方法があると聞きました。これは私が理解するのに苦労している方法です。

また、myApp.warは同じTomcatサーバーで実行されている多くのサーバーの1つであり、localhostとしては実行されません。いくつかのwebappでこの問題を解決できるようにしたいと思います。

Server version: Apache Tomcat/7.0.23
Server built:   Nov 20 2011 07:36:25
Server number:  7.0.23.0
OS Name:        Linux
32
mfa

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

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

たとえば、ホストの名前がmyHostで、アプリがwebappsディレクトリ内のmyApp.warという名前のwarファイルである場合、このコンテンツでTomcat/conf/Catalina/myHost/myApp.xmlを作成できます:

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

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

64
Ryan Stewart

代わりに.propertiesファイルが好きです

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

Tomcat 7 コンテキスト hold ローダー 要素。 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-Nice、ただし最後のオプションを参照!!
  • $CATALINA_BASE/webapps/$APP/META-INF/context.xml-Nice、ただし最後のオプションを参照!!
  • $CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml-best-完全にアプリケーションから外れ、変更を自動的にスキャンしました!!!

ContextはカスタムLoaderを保持できます org.Apache.catalina.loader.VirtualWebappLoader (最新のTomcat 7で使用可能、追加可能.properties)への個別のクラスパス、およびParameterFilterConfig.getServletContext().getInitParameter(name)を介してアクセス)およびEnvironmentnew 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}}'/>

こちらもご覧ください:

[〜#〜] note [〜#〜]クラスパスをライブディレクトリに拡張すると、任意の外部化も許可されますlogging、auth、atcなどの他の構成私はlogback.xmlをそのような方法で外部化します。

[〜#〜] update [〜#〜]Tomcat 8の構文変更<Resources>および<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>
44
gavenkoa

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

1
bmoc

Tomcatのbinフォルダーにsetenv.batまたはsetenv.shスクリプトを追加しました。 classpath変数を次のように設定します

set CLASSPATH=my-propery-folder
0
baliman