相信很多初學的新同學在Maven項目中配置Spring的設定檔時,總會遇到各種找不到的問題,其實理解Tomcat的載入機制,問題便會迎刃而解,那麼我們來看Tomcat啟動
是怎麼一步步載入的.
首先Tomcat啟動時,jvm的bootstrapLoader去載入java的標準庫,這是通過我們配置環境變數即 JAVA_HOME來確定核心庫的位置,接著會執行Tomcat bin目錄的啟動指令碼
Startup.sh 使用start參數調用 Catalina.sh 重寫系統的classpath並載入 bootstarp.jar 和 tomcat-juli.jar, 這些可以理解為Tomcat本身的東西,現在還沒到我們的項目。接著Tomcat
會為每個Context建立ClassLoader .Tomcat 針對每個Context的預設classpath 是 WebApp/WEB-INF/ ,它會從目前的目錄下的class檔案夾載入對應的class檔案,會從lib檔案下載入lib包.從根目錄載入web.xml檔案,接著開始載入.當然Servlet3.0可以不從web.xml開始載入,只要實現了 WebApplicationInitializer 這個介面的類,會在servlet啟動時自動載入。
好了,現在我們走到了我們項目的入口即web.xml ,在這裡我將會配置自己想要的組件。在Maven項目中,設定檔放在Resource中是標準的做法, Resurce中的檔案在編譯好後會在WEB-INF/class/ 檔案夾下,並不在根目錄下的. 現在我們來看這種Spring 配置方法
<servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
當把設定檔放到webapp下時,這樣是找不到設定檔的,因為classpath的尋找範圍是從/WEB-INF/classes中尋找的,而把設定檔放到webapp下,編譯後的位置是在/WEB-INF根目錄下,所以會找不到檔案。classpath 和 classpaht*的區別 , classpath* 會尋找根目錄下所有的檔案,至到找到匹配檔案即可。兒classpath只會在/WEB-INF/classes中尋找。
其實最重要的是立即的Tomcat 的classpath. 千萬不能看你源碼目錄結構來理解classpath. 因為Tomcat是跑的你編譯後的目錄。