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
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ルックアップを実行して、その文字列値を取得します。
代わりに.properties
ファイルが好きです
javax.servlet.Filter
、javax.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
)への個別のクラスパス、および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}}'/>
こちらもご覧ください:
[〜#〜] 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>
構成(プロパティファイル)をJARファイルのApache Tomcat\libに配置し、Webアプリケーションから削除することができます。 Tomcatのクラスローダーがwebappで設定を見つけられない場合、「lib」ディレクトリで見つけようとします。そのため、設定をグローバルlib dirに移動するだけで設定を外部化できます(他のwebapp間で共有されます)。
Tomcatのbin
フォルダーにsetenv.bat
またはsetenv.sh
スクリプトを追加しました。 classpath
変数を次のように設定します
set CLASSPATH=my-propery-folder