1. 程式人生 > >Maven 專案的 classpath 理解

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 配置方法

  1.     <servlet>
  2.         <servlet-name>appServlet</servlet-name>
  3.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4.         <init-param>
  5.             <param-name>contextConfigLocation</param-name>
  6.             <param-value
    >classpath:servlet-context.xml</param-value>
  7.         </init-param>
  8.         <load-on-startup>1</load-on-startup>
  9.     </servlet>

當把配置檔案放到webapp下時,這樣是找不到配置檔案的,因為classpath的查詢範圍是從/WEB-INF/classes中查詢的,而把配置檔案放到webapp下,編譯後的位置是在/WEB-INF根目錄下,所以會找不到檔案。classpath 和 classpaht*的區別 , classpath* 會查詢根目錄下所有的檔案,至到找到匹配檔案即可。兒classpath只會在/WEB-INF/classes中查詢。

  其實最重要的是立即的Tomcat 的classpath. 千萬不能看你原始碼目錄結構來理解classpath. 因為Tomcat是跑的你編譯後的目錄。