2012-08-06 428 views
1

我的Java Web应用程序在war文件中包含配置文件(例如myapp.xml)。我在我的web.xml文件中提供了这个文件的路径,如下所示。Tomcat 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

是有一些可用的变量,会给我的应用程序目录的路径?

如果不是,你能想出其他方法来完成这个吗?

回答

1

您可以将变量-Dapp.base=/foo/bar传递给tomcat的JVM(取决于catalina.sh中的版本或/ conf中的文件),然后在您的WC servlet中使用`System.getProperty(..)读取它。

虽然建议将这些配置放置到外部位置,以便您可以在不触及已部署的应用程序的情况下更改它们,并且还可以根据需要启用未打包的WAR部署。

如果您想访问应用程序中的资源,那么您最好使用相对(而不是绝对)路径。

  • 如果资源是在类路径中,使用getClass().getResourceAsAstream(..)
  • 如果资源类路径之外,使用servletContext.getResourceAsStream(..)
+0

我知道我可以给这样的tomcat变量,但那不能回答我的问题。我想在该web应用程序的web.xml中引用当前部署的应用程序的路径。有了这个解决方案,我将不得不为所有预期的部署提供变量,并仍然修改web.xml以引用与该预期部署相关的变量。 – 2012-08-06 18:56:41

+0

为什么你需要绝对路径?你可以(也应该)使用相对路径。查看我的更新 – Bozho 2012-08-06 19:35:32

+0

感谢您的更新。你展示的内容将允许我访问代码中的应用程序资源,但我不知道如何将它转换为我可以放在我的web.xml中以引用myapp.xml ... – 2012-08-06 20:21:07

0

您可以使用

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

得到phyical主你应用程序的目录。

+0

这将允许我在应用程序的代码中获取路径,但不会从web.xml中获取路径。 – 2012-08-06 20:21:46