2012-08-06 431 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