Maven 專案的 classpath 理解
相信很多初學的新同學在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
- </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是跑的你編譯後的目錄。