2015年10月13日 星期二

java/tomcat find class file path

之前好像有寫過用 當下的 class 找他的實體檔案路徑在那~
不過當然這都在一個前提下~ 該 class/resource 沒有被包在 jar 檔裡~
(在jar檔裡的話~阿就通通zip在一起了,那來的各別路徑Orz...)

所以以下一律以散的class來講~
一般正常來說,取該 class/或是resource/甚至只是要個檔案路徑,可以用這種寫法~
String javaPath = ClassLoader.getSystemResource(".").getPath();

但是在 tomcat 下, SystemResource是被改寫過的(會null)~不過用另一招可以再拿到~
String libPath =  this.getClass().getClassLoader().getResource(".").getPath();
--> 這個會拿到 tomcat lib 的那個 path...WEB-INF/lib/

String javaPath =  this.getClass().getClassLoader().getResource("log4j.properties").getPath();
--> 是個爛解~不過這樣就可以拿到 WEB-INF/classes/ 的實體路徑
(你不會說你不用 log4j 吧!!)

String somewherePath =  this.getClass().getClassLoader().getResource("test/files").getPath();
--> 如果你有建個該建的資料夾在那是可以拿到  WEB-INF/classes/test/files/

老實說~用ClassLoader這個蠻容易被裱的...

不過通常大家若在 webapps 下,是可以用 ServletContext 來取得 webapps/xxx/ 的那個實體路徑...

但是我想通用於一般跟在 tomcat 下的情況~目前是這樣寫著來用~
          URL ul = ClassLoader.getSystemResource(MY_LOACTION);
               if(ul == null)  {
                    //tomcat or other webapps has no SystemResource
                    path = this.getClass().getClassLoader().getResource(MY_LOACTION).getPath();
                    //System.out.println(this.getClass().getClassLoader().getResource(".").getPath());
                    //System.out.println(this.getClass().getClassLoader().getResource("log4j.properties").getPath());
                }  else  {
                    path = ul.getPath();
                }


沒有留言: