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

发布于 2025-01-07 02:05:43 字数 1343 浏览 2 评论 0原文

我正在编写一个由 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?我知道如何获取路径TOMCAT_HOME,但我们的操作人员可能会选择更改 Tomcat 主机或引擎名称。

作为解决方法,我始终可以将单个参数写入 context.xml,如下所示。

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

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

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

预先感谢,亚当。

I'm writing a JSF 2.1 web application, which is hosted by Tomcat 6.

At runtime, I'd like to retrieve a set of complex parameters related to external services.

At development time, I don't know what these parameters will be or how may there'll be.

The parameters will be set by our operations staff, and must therefore be defined outside of the .war file.

I thought that context.xml would help (i.e. TOMCAT_HOME/conf/Catalina/localhost/MyWebApp.xml) but this can only accept scalar parameters, and there doesn't seem to be any way I can iterate over them.

Here is an example of what I'd like to access at runtime.

<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>

Is there a foolproof way I can programatically gain access to TOMCAT_HOME/conf/Catalina/localhost/MyWebApp.xml? I know how to get the path to TOMCAT_HOME, but our operations guys may choose to change the Tomcat host or engine name.

As a workaround, I can always write a single parameter to context.xml as follows.

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

But this is also an extra point of error, an extra step in the install instructions, needs to be maintained etc.

I'm sure there must be an easy way to do this, what am I missing?

Thanks in advance, Adam.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小矜持 2025-01-14 02:05:43

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

一旦它位于类路径中,您就可以通过类加载器获取它。

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

Create your own XML file and put it in one of the existing paths covered by Tomcat's default runtime classpath such as Tomcat/lib, or add its path to the runtime classpath by specifying it in shared.loader property of Tomcat's /conf/catalina.properties.

Once it's in the classpath, you can just obtain it through the classloader.

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream input = loader.getResourceAsStream("services.xml");
// ...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文