如何为Tomcat提供复杂的运行时参数?

时间:2012-02-18 17:46:16

标签: java-ee servlets configuration jsf-2 tomcat6

我正在编写一个由Tomcat 6托管的JSF 2.1 Web应用程序。

在运行时,我想检索一组与外部服务相关的复杂参数。

在开发时,我不知道这些参数是什么,或者有什么可能。

参数将由我们的操作人员设置,因此必须在.war文件之外定义。

我认为context.xml会有所帮助(即TOMCAT_HOME/conf/Catalina/localhost/MyWebApp.xml),但这只能接受标量参数,似乎没有任何方法可以迭代它们。

以下是我想在运行时访问的示例。

<services>
    <service id="bbc" name="BBC Weather" url="http://www.bbc.co.uk/weather/" />

    <service id="underground" name="Weather Underground" url="http://www.wunderground.com/weather/api/">
        <login username="test" password="test" />
    </service>

    <service id="network" name="The Weather Network" url="http://www.theweathernetwork.com/">
        <method type="post" />
    </service>
</services>

我是否可以通过编程方式获得对TOMCAT_HOME/conf/Catalina/localhost/MyWebApp.xml的访问权限?我知道how to get the path to TOMCAT_HOME,但我们的运营人员可能会选择更改Tomcat主机或引擎名称。

作为一种解决方法,我总是可以将一个参数写入context.xml,如下所示。

<Parameter name="config.file" value="C:/Program Files/Apache Software Foundation/Tomcat 6.0/conf/Catalina/localhost/MyConfigFile.xml" />

但这也是一个额外的错误点,需要维护安装说明中的额外步骤等。

我确信必须有一个简单的方法来做到这一点,我错过了什么?

提前谢谢,亚当。

1 个答案:

答案 0 :(得分:2)

创建您自己的XML文件并将其放在Tomcat的默认运行时类路径(如Tomcat/lib)所涵盖的现有路径之一中,或者通过在shared.loader属性中指定它来将其路径添加到运行时类路径中。 Tomcat的/conf/catalina.properties

一旦它在类路径中,你就可以通过类加载器获得它。

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream input = loader.getResourceAsStream("services.xml");
// ...