我正在编写一个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.properties
的shared.loader
属性中指定它来将其路径添加到运行时类路径中。
一旦它在类路径中,您就可以通过类加载器获得它。
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream input = loader.getResourceAsStream("services.xml");
// ...