在Tomcat中外部化属性

时间:2016-03-16 09:27:34

标签: java tomcat jndi

我想将一系列依赖于环境的设置配置为外部资源,以便可以在任何应用程序服务器中配置相同的WAR工件。

在Glassfish中,我记得我刚刚使用内置的属性资源JNDI工厂创建了一个.properties文件,它就像一个魅力,但在Tomcat中没有这样的东西。

我尝试定义java.net.URL和java.lang.String来定义此文件所在的路径,但是我收到以下错误:

Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/c://app.properties]

那么为我的应用程序创建一个与环境无关的属性集是什么好方法呢?

PS:这就是我在Spring中定义属性的方式:

<jee:jndi-lookup id="appProperties" jndi-name="java:comp/env/url/urlAppProperties" />

        <bean id="application-properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
            <property name="locations">
                <list>
                    <value>#{ appProperties }</value>
                </list>
            </property>
        </bean>

1 个答案:

答案 0 :(得分:0)

您可以使用Tomcat的资源配置元素将外部配置值添加到JNDI上下文。如Tomcat documentation中所述,您可以在<GlobalNamingResources>中定义一个server.xml元素,其中列出了一组配置值,这些配置值可供该服务器上的所有上下文(Web应用程序)使用:

取自Tomcat文档的示例:

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

然后可以通过java:comp/env上下文中的JDNI获取这些环境变量。要在Web应用程序中使用此类变量,您必须使用context.xml元素在各个<ResourceLink>配置文件中链接它们。

<Context>
    <ResourceLink name="maxExemptions" global="maxExemptions" type="java.lang.Integer"/>
</Context>

通过此设置,您可以通过标准JNDI API访问这些值。