1. 程式人生 > >java專案的classpath說明

java專案的classpath說明

首先  classpath是指 WEB-INF資料夾下的classes目錄 

解釋classes含義: 
1.存放各種資源配置檔案 eg.init.properties log4j.properties struts.xml 
2.存放模板檔案 eg.actionerror.ftl 
3.存放class檔案 對應的是專案開發時的src目錄編譯檔案 
總結:這是一個定位資源的入口 

一、javaWeb專案路徑問題

  把配置檔案如:struts.xml、applicationContext.xml等放到src目錄(就是存放程式碼.java檔案的目錄),然後使用“classpath:xxx.xml”來讀取,都放到src目錄準沒錯
    曾經試過把配置檔案放到WEB-INF目錄,然後以路徑“/WEB-INF/xxxx.xml”來成功讀取配置檔案
但是在用ClassPathXmlApplicationContext()函式不能讀取這樣的路徑,用上面的方法才能成功讀取配置檔案

回答:

【01】 src路徑下的檔案在編譯後會放到WEB-INF/clases路徑下吧。預設的classpath是在這裡。直接放到WEB-INF下的話,是不在classpath下的。用ClassPathXmlApplicationContext當然獲取不到。

【02】如果單元測試的話,可以在啟動或者執行的選項裡指定classpath的路徑的。用maven構建專案時候resource目錄就是預設的classpath

【03】classPath即為java檔案編譯之後的class檔案的編譯目錄一般為web-inf/classes,src下的xml在編譯時也會複製到classPath下

比如我們這裡 web.xml 部分程式碼如下

1、/表示 web根目錄

contextConfigLocation

/springmvc.xml

/springmvc.xml 的/表示 web目錄(或者webRoot,webApp)

我們的 springmvc.xml 只有放在如上圖位置(web的根目錄),伺服器才不會報錯,程式得以正常執行
2、預設也是在 web根目錄

contextConfigLocation

springmvc.xml

我們這裡不加 / 的效果和加 /是 一樣的,springmvc.xml都是要放在web的根目錄,即和第一種相同
3、classpath:預設指向是 src 目錄

contextConfigLocation

classpath:com/liuyanzhao/ssm/springmvc.xml

nit-param>classpath 的一般指的是 src 目錄,com.liuyanzhao.ssm是包名,寫路徑的時候是com/liuyanzhao/ssm/springmvc.xml

如果我們把springmvc.xml放到src根目錄,只需要寫 classpth:springmvc.xml 啦
4、classpath:也可以時其他 Source Folder

我們在專案裡新建一個Source Folder(注意,不是普通的資料夾),然後裝個資料夾也加入了環境。

contextConfigLocation

classpath:spring/springmvc.xml

注意:在多個classpath中存在同名資源,都需要載入,

那麼用classpath:只會載入第一個

 

二、web.xml 配置中classpath: 與classpath*:的區別

classpath 和 classpath* 區別: 
classpath:只會到你的class路徑中查詢找檔案; 
classpath*:不僅包含class路徑,還包括jar檔案中(class路徑)進行查詢. 


Java程式碼  收藏程式碼

<param-value>classpath:applicationContext-*.xml</param-value>  


或者引用其子目錄下的檔案,如 
Java程式碼  收藏程式碼

<param-value>classpath:context/conf/controller.xml</param-value>  


classpath*的使用:當專案中有多個classpath路徑,並同時載入多個classpath路徑下(此種情況多數不會遇到)的檔案,*就發揮了作用,如果不加*,則表示僅僅載入第一個classpath路徑,程式碼片段: 
Java程式碼  收藏程式碼

<param-value>classpath*:context/conf/controller*.xml</param-value>  


另外: 
"**/" 表示的是任意目錄; 
"**/applicationContext-*.xml"  表示任意目錄下的以"applicationContext-"開頭的XML檔案。  
程式部署到tomcat後,src目錄下的配置檔案會和class檔案一樣,自動copy到應用的 WEB-INF/classes目錄下 
classpath:與classpath*:的區別在於, 


前者只會從第一個classpath中載入,而 
後者會從所有的classpath中載入  


如果要載入的資源, 
不在當前ClassLoader的路徑裡,那麼用classpath:字首是找不到的, 
這種情況下就需要使用classpath*:字首 


在多個classpath中存在同名資源,都需要載入, 
那麼用classpath:只會載入第一個,這種情況下也需要用classpath*:字首 


注意: 
用classpath*:需要遍歷所有的classpath,所以載入速度是很慢的,因此,在規劃的時候,應該儘可能規劃好資原始檔所在的路徑,儘量避免使用 classpath* 

 

三、例項解析

寫的一個小專案

下邊是它對應的webapps中的路徑:

經對比,確實如上面所說