【发布时间】:2014-10-30 11:52:45
【问题描述】:
我正在运行 Tomcat 7,我需要向我的两个 Web 应用程序传递一个同名但每个 Web 应用程序具有不同值的环境变量。
有没有办法在不使用 JNDI 的情况下拥有应用程序特定的环境变量(同一个变量每个应用程序具有不同的值)?
我正在考虑在特定于应用程序的上下文中使用 -Dname=bob 之类的东西。
【问题讨论】:
标签: tomcat7
我正在运行 Tomcat 7,我需要向我的两个 Web 应用程序传递一个同名但每个 Web 应用程序具有不同值的环境变量。
有没有办法在不使用 JNDI 的情况下拥有应用程序特定的环境变量(同一个变量每个应用程序具有不同的值)?
我正在考虑在特定于应用程序的上下文中使用 -Dname=bob 之类的东西。
【问题讨论】:
标签: tomcat7
为每个应用程序创建一个文件,命名为应用程序 war 文件,并将该文件放在 Tomcat 7 conf/Catalina/localhost/ 目录中。
然后每个文件都可以包含一些特定于应用程序的环境变量。
例如部署在webapps目录下的两个应用project1.war和project2.war。
在文件conf/Catalina/localhost/project1.xml中
<Context path="" docBase="project1">
<Environment name="product" value="one" type="java.lang.String" override="false" />
</Context>
conf/Catalina/localhost/project2.xml
<Context path="" docBase="project1">
<Environment name="product" value="two" type="java.lang.String" override="false" />
</Context>
我也没有经历过双重部署。
我的开发服务器主机是:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" deployOnStartup="true">
我的生产服务器主机是:
<Host name="www.learnintouch.com" appBase="webapps" unpackWARs="true" autoDeploy="true" deployOnStartup="true">
为了检索变量的值,我使用了 Spring 条件上下文:
public class ProductProjectCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("product") == null || context.getEnvironment().getProperty("product").equals("project");
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Conditional(ProductProjectCondition.class)
public @interface ProductProject {
}
然后可以使用@ProductProject 注释。
【讨论】: