Tomcat: 为不同的webapps指定不同的属性

Tomcat: specify different properties for different webapps

我 运行 一系列独立的网络应用程序,它们需要单独的配置,但本质上都使用相同的代码,因此也使用相同的 war 文件。 war 文件能够从 environment variable 读取其配置文件的路径,我可以看到如何在 context.xml 中为整个 Tomcat 上下文设置环境变量] 文件。

但是,我看不到如何 运行 在单独的上下文中单独的 Web 应用程序;并且同一上下文中的所有 Web 应用程序都将看到相同的环境变量值,因此会从同一位置加载配置。

是否有一种机制可以在上下文中为不同的网络应用程序设置不同的环境值;如果没有,是否有其他机制(在 WAR 文件本身之外)为不同的 webapps 指定不同的 属性 值,或者为每个 webapps 创建单独的上下文的方法?

最后,如果我可以将配置移动到 webapp 之外,是否可以让多个 webapps 使用相同的实际 WAR 文件(因为除了配置之外它们都是相同的,并且这会使升级很多如果我只需要放入一个 WAR 文件就更容易了)?

编辑: 查看您的代码(特别是 configuration.clj) it appears that you are using system environment variables (which are shared among all web applications). You should use environment entries 并通过调用 InitialContext.lookup("java:comp/env/FOO") 而不是 System.getenv("FOO") 来检索它们。

从技术上讲,每个应用程序都有自己的 <Context>,它由(参见 Tomcat documentation)组成:

  • 来自 $CATALINA_BASE/conf/context.xml
  • 的值
  • 来自 $CATALINA_BASE/conf/<enginename>/<host>/context.xml.default
  • 的值
  • 来自 $CATALINA_BASE/conf/<enginename>/<host>/<path>.xml 的值或(如果它丢失并且 <Host>deployXML 不是假的)您应用程序 META-INF/context.xml 中的条目。

每个更具体的配置文件都可以覆盖更通用的配置文件的属性,而嵌套组件会累加起来。因此你应该定义:

  • $CATALINA_BASE/conf/<enginename>/<host>/<path>.xml
  • 中每个应用程序特定的环境条目
  • $CATALINA_BASE/conf/context.xml 中所有应用程序通用的环境条目。

备注:通常<enginename>Catalina,而<host>localhost.

如果您使用相同的 WAR 文件,您可以将它放在文档库之外(假设 /usr/share/my.war)并在 $CATALINA_BASE/conf/<enginename>/<host>:

<Context docBase="/usr/share/my.war">
    <!--
        environment entries
    -->
</Context>

它们的部署路径将从 XML 的名称推断出来。