2009-06-15 139 views
3

我想为多个不同的客户部署相同的Web应用程序。每个部署在web.xml配置文件的其中一个元素中需要不同的值。如何自定义我的web.xml配置

没有为每个客户建立不同的.war文件(在每个.war的web.xml中设置不同的值),是否可以为不同的客户配置值?例如,web.xml文件可以从每个部署属性文件中获取值吗?

我们使用Tomcat作为servlet容器。

回答

1

您可以使用Tomcat的JNDI support在web.xml外指定更改属性。

例如,指定Context元素中的环境条目:

<Context ...> 
    ... 
    <Environment name="maxExemptions" value="10" 
     type="java.lang.Integer" override="false"/> 
    ... 
</Context> 

然后在web.xml中指定的链接,这个环境变量:

<env-entry> 
    <env-entry-name>maxExemptions</param-name> 
    <env-entry-type>java.lang.Integer</env-entry-type> 
</env-entry> 

,然后从代码中调用使用(从Professional Apache Tomcat 6):

private final Object lock = new Object(); 
... 
synchronized (lock) { 
    Context initCtx = new InitialContext(); 
    Context envCtx = initCtx.lookup("java:comp/env"); 
    Integer maxExemptions = (Integer) envCtx.lookup("maxExemptions"); 
} 

O您可以使用弹簧将您的价值注入到您的应用程序中<jndi-lookup />

<bean id="someBean"> 
    <property name="maxExemptions"> 
     <jndi-lookup jndi-name="xxx" /> 
    </property> 
</bean> 
0

简短的回答:不改变战争是不可能的。

一个更详细的版本:战争可以包含一些参数和默认值,您可以经常使用应用程序服务器或Web服务器的控制台更改这些参数和默认值。这取决于你想要配置什么,这些标准的上下文/ servlet/...参数?

1

你可以将这个元素移到web.xml之外吗?如果您可以从属性文件中读取它,那么您可以为每个客户创建一个不同的属性文件,并为每个客户打包属性文件的战争。然后在运行时,您可以根据环境变量读取适当的属性文件。