前段時間使用ClassLoader類的方法來加載classPath路徑下的配置文件,其中用到getSystemResource(String name)
、getSystemResourceAsStream(String name)
、getSystemResources(String name)
這幾個方法的時候出現問題。web
問題出如今,程序用main方法的方式運行的時候可以正常運行,可是使用tomcat運行的時候就會報空指針異常。tomcat
兩種方式運行的ClassLoader加載機制不一樣,致使了不一樣的結果。服務器
main方法運行是啓動的本地的jdk來加載類,加載機制是:app
BootStrap ClassLoader:稱爲啓動類加載器,是Java類加載層次中最頂層的類加載器,負責加載JDK中的核心類庫,如:rt.jar、resources.jar、charsets.jar等,這個是經過native方法調用C語言實現的。jvm
Extension ClassLoader:稱爲擴展類加載器,負責加載Java的擴展類庫,默認加載JAVA_HOME/jre/lib/ext/目下的全部jar。spa
App ClassLoader:稱爲系統類加載器,負責加載應用程序classpath目錄下的全部jar和class文件。.net
因此classPath路徑下的資源都是由AppClassLoader來加載的。指針
tomcat實現了本身的一套類加載器,它的Extension ClassLoader與jvm是相同的,可是沒有使用App ClassLoader來加載本身項目裏的類和資源。code
整個Tomcat的classLoader分爲了兩條線,左邊的一條線爲catalinaLoader,這個是Tomcat服務器專用的,用於加載Tomcat服務器自己的class,右邊的一條線則爲web應用程序用的,每個web應用程序都有本身專用的WebappClassLoader,用於加載屬於本身應用程序的資源,例如/web-inf/lib下面的jar包,classes裏面的class文件。。。blog
而後上面也體現了總體的classLoader的雙親繼承關係。。。。
詳細能夠看這裏http://blog.csdn.net/fjslovejhl/article/details/21328347
getSystemResource(String name)
、getSystemResourceAsStream(String name)
、getSystemResources(String name)
內部實現的時候都是用到了ClassLoader system = getSystemClassLoader();的方法,獲取的ClassLoader都是App ClassLoader因此在使用tomcat運行的時候就會取不到classPath路徑下的資源,由於都是WebappClassLoader加載的。
使用 當前類.class.getClassLoader().getResource(String name)
、getResourceAsStream(String name)
、getResources(String name)這三種方法。