1,有一個類 ResourceRender ,所在的 package 是 com.daston.resource
2,在 /web-inf/classes 目錄下有一個 abc.xml 文件,需要在某個時候裝載此配置文件
3,這個WEB應用的classpath假設為 /appsd
一般的做法:
String classPathName = ResourceRender.class.getResource("/").getPath();
從理論上看,這樣,應該可以直接得到 classes 的絕對路徑;而在事實上,Tomcat 是可以這樣獲得的;
而在 WebSphere 部署里面,情況并不是這樣,這樣得到的路徑是 WebSphere 的loader所在的目錄,比如 /work/loader,而不是 /web-inf/classes。
針對這種情況,可以考慮這樣的做法:
String classPathName = ResourceRender.class.getResource("").getPath();
這樣做,classPathName 是這樣的,/web-inf/classes/com/daston/resource/ ;
當然,這樣根據 ResourceRender 的 package 將后綴去掉,從而獲得classes 的絕對路徑。
這樣的測試幾乎在 Tomcat 和 WebSphere 都是成功的。
可是,今天打包部署系統時,問題出來了,通過調試,返回的路徑竟然是 %Tomcat%\work\Catalina\localhost\appsd\loader ;
系統提示找不到指定的文件 %Tomcat%\work\Catalina\localhost\appsd\loader\abc.xml
經過反復調試和驗證,最終問題的原因找到了。
原來,我們打包部署的文件是將class文件打包到jar文件中,因此在,classes目錄下是不會存在 /com/daston/resource 這些目錄的,
所有的JAR文件都被打包到 jar 文件中了。
經過測試,發現,只要classes目錄下有/com/daston/resource 這個目錄,不一定有真正的 ResourceRender.class 文件,
上面的代碼執行結果都是預期的結果,但是,一旦把目錄刪除或改名,上面代碼執行結果就是 Tomcat 的work loader 目錄。
因此,為了統一解決這樣的問題,必須使用新的方式來實現:
URL url = ResourceRender.class.getClassLoader().getResource("abc.xml");
String classPathName = url.getPath();
int endingIndex = classPathName.length()-"abc.xml".length();
classPathName = classPathName.substring(0, endingIndex);
轉自 http://hi.baidu.com/lontoo/blog/item/a264b525f315bb6434a80fa7.html