在java項目中,你必定碰到過classpath,一般狀況下,咱們是用它來指定配置/資源文件的路徑。在剛開始學習的時候,本身也糊里糊塗,可是如今,是時候弄清楚它究竟是指什麼了。java
顧名思義,classpath就是class的path,也就是類文件(*.class的路徑)。一談到文件的路徑,咱們就頗有必要了解一個java項目(一般也是web項目)它在真正運行時候,這個項目內部的目錄、文件的結構;這樣,咱們纔好分析、理解classpath。web
下面,我以一個ssm的項目爲例,我先把開發時候的項目的目錄結構圖放出來。根據maven的約定,通常咱們的項目結構就像下面這樣。spring
而咱們常常用到classpath的地方,就是在指定一些配置/資源文件的時候會使用到。好比說,咱們在web.xml中指定springmvc的配置文件,以下圖,咱們使用:classpath:entry/dev/spring-mvc.xml
;再好比,當咱們把*Mapper.xml文件放在了main/java/../mapping/
文件夾下時,在mybatis的配置文件中配置其位置,咱們使用:spring-mvc
classpath*:**/mapper/mapping/*Mapper.xml
很顯然,上面這2個classpath的配置,是爲了告訴配置文件,去哪裏尋找咱們要指定的配置文件。要想弄清楚爲何是上面這樣寫的,咱們就要來看看項目運行時(或者是發佈後)的目錄結構了。mybatis
咱們使用IDEA對項目進行打包,一種是war包,一種是explorer的文件夾,war包解壓後就是explorer了。咱們來對解壓後的目錄結構進行分析。mvc
通過對比,咱們要注意到,開發時期的項目裏,src/main/
下面的java
和resources
文件夾都被(編譯)打包到了生產包的WEB-INF/classes/
目錄下;而原來WEB-INF下面的views和web.xml則仍然仍是在WEB-INF下面。同時由maven引入的依賴都被放入到了WEB-INF/lib/
下面。最後,編譯後的class文件和資源文件都放在了classes目錄下。 app
在編譯打包後的項目中,根目錄是META-INF
和WEB-INF
。這個時候,咱們能夠看到classes這個文件夾,它就是咱們要找的classpath。maven
在第1個例子裏,classpath:entry/dev/spring-mvc.xml
中,classpath就是指WEB-INF/classes/
這個目錄的路徑。須要聲明的一點是,使用classpath:
這種前綴,就只能表明一個文件。學習
在第2個例子裏,classpath*:**/mapper/mapping/*Mapper.xml
,使用classpath*:
這種前綴,則能夠表明多個匹配的文件;**/mapper/mapping/*Mapper.xml
,雙星號**
表示在任意目錄下,也就是說在WEB-INF/classes/
下任意層的目錄,只要符合後面的文件路徑,都會被做爲資源文件找到。spa