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



我正在编写一个JSF 2.1 web应用程序,该应用程序由Tomcat6托管。

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

在开发的时候,我不知道这些参数会是什么,也不知道怎么会有

参数将由我们的操作人员设置,因此必须在.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?我知道如何获得TOMCAT_HOME的路径,但我们的操作人员可能会选择更改TOMCAT主机或引擎名称。

作为一种变通方法,我总是可以向context.xml编写一个参数,如下所示。

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

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

我相信一定有一个简单的方法可以做到这一点,我缺少什么?

提前谢谢,亚当。

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

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

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

最新更新