Tomcat的web.xml配置变量

3

我的Java Web应用程序在war文件中包含一个配置文件(例如myapp.xml)。我在web.xml文件中提供了该文件的路径,如下所示。

  <servlet>
    <servlet-name>wc</servlet-name>
    <servlet-class>com.myapp.servlets.WC</servlet-class>
    <init-param>
      <param-name>configfile</param-name>
      <param-value>${catalina.base}/webapps/myapp/WEB-INF/myapp.xml</param-value>
    </init-param>
  </servlet>

问题在于我现在想在同一台服务器上部署不同版本的应用程序,以进行测试和开发,并且每个版本都会在webapps下有一个不同的路径。我希望避免为每个部署修改web.xml文件,但我找不到任何引用WEB-INF文件夹的方法。
我想做的是:
  <servlet>
    <servlet-name>wc</servlet-name>
    <servlet-class>com.myapp.servlets.WC</servlet-class>
    <init-param>
      <param-name>configfile</param-name>
      <param-value>${app.base}/myapp.xml</param-value>
    </init-param>
  </servlet>

${app.base} 等于 ${catalina.base}/webapps/myapp/WEB-INF

是否有可用的变量可以提供应用程序目录的路径?

如果没有,您有想到其他实现此目的的方法吗?

2个回答

2
您可以通过在Tomcat的JVM中传递变量-Dapp.base=/foo/bar(取决于版本,可以是catalina.sh或/conf中的文件),然后在您的WC servlet中使用`System.getProperty(..)`来读取它。
虽然建议将这些配置放在外部位置,以便您可以更改它们而不触及部署的应用程序,并且在需要时启用未打包的WAR部署。
如果要访问应用程序中的资源,则最好使用相对路径(而不是绝对路径)。
  • 如果资源在类路径上,请使用getClass().getResourceAsAstream(..)
  • 如果资源在类路径之外,请使用servletContext.getResourceAsStream(..)

我知道我可以像那样给Tomcat变量,但那并不能回答我的问题。我想引用web.xml中当前部署应用程序的路径。使用这种解决方案,我将不得不为所有预期的部署提供变量,并仍然修改web.xml以引用与该预期部署相关的变量。 - Daniel Watrous
为什么需要绝对路径?你可以(而且应该)使用相对路径。请查看我的更新。 - Bozho
谢谢您的更新。您展示的内容将允许我在代码中访问应用程序资源,但我不确定如何将其转换为我可以放入我的web.xml以引用myapp.xml的内容。 - Daniel Watrous
你无法这样做。但是既然你在代码中会读取这个参数,你可以把逻辑放在那里,而不是XML中。 - Bozho

0

您可以使用

...
servletContext().getRealPath("");
...

获取应用程序的物理主目录。


这将允许我在我的应用程序代码中获取路径,但不是从web.xml。 - Daniel Watrous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接