第一部分:我自己的處理方法
今天要解析 IK Expression 的 IKExpression.cfg.xml 文件,以解析其中系統函數默認配置和用戶函數配置,於是又遇到了一個老問題:Java Web 開發中如何獲取部署目錄下 WEB-INF 中 classes 的物理路徑(網上也有同行描述為:獲取服務器中當前WebRoot的物理路徑)?
閑話不多說,我先附上代碼片段:
1 pathStr = this.getClass().getClassLoader().getResource("").getPath(); 2 // 對 Windows 下獲取 物理路徑 做 特殊處理 3 if("\\".equals(File.separator)) { 4 pathStr = pathStr.substring(1).replaceAll("/", "\\\\"); 5 }
代碼很簡單,也不用過多的解釋了,相信大家都能看懂的。為什么要對 Windows 下的情況做特殊處理呢?因為如果不做這個處理,得到的結果就如下圖所示:

大家可以看到所有 File Separator 都是“/”,而實際我們期望的是“\”。博主用的是 Windows 8 64位版, MyEclipse 8.6 開發, Tomacat 部署,配合虛擬機里面的 Ubuntu 測試 Linux 下的運行效果。所以情況可能跟大家的不太一樣,大家根據實際情況修改代碼吧 o(∩_∩)o
最后的運行效果圖如下:

上圖是在 Ubuntu下部署后運行的效果,下圖是在 Windows 8 的 MyEclipse 中運行的效果:

下面再附上 Ubuntu 中運行的截圖:

這種方法是利用Java的類加載機制調用 XXX.class.getClassLoader().getResource(""); 方法來獲取到 ClassPath,然后處理獲得 WebRoot 目錄。這種方式只能是該class在WebRoot/WEB-INF/classes下才能生效,如果該class被打包到一個jar文件中,則該方法失效。
如果有不完善的地方或更好的方法,歡迎批評指正,謝謝 o(∩_∩)o
第二部分:可供大家參考的其他“高端”做法
最后我再附上網上的其他比較“高端”的做法共大家參考:
- 如果是Servlet, Action, Controller, 或者 Filter, Listener, 攔截器等相關類時,我們只需要獲得 ServletContext,然后通過ServletContext.getRealPath("/")來獲取當前應用在服務器上的物理地址;
- 如果在類中取不到ServletContext時,可采用博主使用的方法,或如下方法:采用 Spring 框架的思路,在WEB-INF/web.xml中,創建一個 webAppRootKey 的 param,指定一個值(默認為 webapp.root)作為鍵值,然后通過Listener,或者Filter,或者 Servlet 執行 String webAppRootKey = getServletContext().getRealPath("/");並將 webAppRootKey 對應的 webapp.root 分別作為 Key , Value 寫到 System Properties 系統屬性中。之后在程序中通過 System.getProperty("webapp.root") 來獲得 WebRoot 的物理路徑。
