maven使用經驗與心得整理

概述#

日常開發中,我們用到的maven相關功能大概以下幾種:
1、 管理jar依賴
2、 構建項目(打包、編譯等)
3、 發佈項目(共享、上傳至服務器,供他人使用)

簡單介紹:#

1、管理依賴##

jar一般在pom.xml文件的中配置,以spring core爲例,一般格式如下:

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>4.1.1.RELEASE</version>
</dependency>

其中groupId一般爲項目(jar war pom等)的發佈機構名稱;
artifactId爲項目名稱;
version爲項目版本;
在項目編譯打包的時候,ide會自動到maven倉庫去查找相應的jar文件,打包並存放在項目的相應路徑下(如web項目的lib目錄下)
(關於依賴的各個名稱和寫法,請見後文:詳細說明–依賴說明)

2、構建項目:##

這裏所說的構建項目主要指打包、編譯、運行測試用例等操作,即maven的生命週期中的打包過程。
最常用的就是compile了,一般項目修改代碼以後都要重新編譯,然後加載到tomcat中運行調試。
其它的還有clean、package等比較常用的操作,請見詳細說明–生命週期部分

3、發佈項目:##

如果我們寫一些通用框架,或者自己封裝了一些常見的工具類,想要打包爲jar並且供他人使用,那麼我們可以通過maven發佈到公共倉庫(私服)供他人下載依賴使用。
比如每個公司都會有自己的框架,持久層、控制層或者其它功能等。當我們沒有使用maven的時候,我們是直接把別人的jar拷貝到項目的library目錄下,而現在我們有了maven就不用自己到處拷貝jar包了,只需要在發佈的時候找到別人發佈到倉庫時候寫的groupId artifactId version等信息就能直接添加依賴了,也就是相當於第一步的依賴管理。

4、多模塊##

maven實際上通過多模塊的思想來組織依賴的,每一個項目或者jar都是一個模塊,我們可以把一些通用的,不常變動的東西寫在一些指定的模塊下,在另外一個項目中引用依賴(這裏就有點類似【1、依賴管理】,這樣一來可以讓項目結構更清晰、方便別人依賴使用,如果項目都是一個模板,也可以複用等等,還有其它各種好得自己摸索感受吧)
#詳細說明:#

1、依賴名稱:##

這裏要注意,在我們自己發佈項目時儘量遵守以上規範,否則當別人搜索依賴時會寫的很冗餘很混亂,這也是很多私服中不斷重複上傳相同jar會導致項目出錯的原因。
正常來說,一個項目(如spring的jar)應該是機構、名稱和版本唯一的,當我們引用時,可以通過這三個參數唯一標識出一個項目,在上傳這些項目的時候,很多人喜歡在artifactId中寫上本該屬於groupId的內容,這其實是不合理的。
舉個錯誤寫法例子:

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId> org.springframework .spring-core</artifactId>
     <version>4.1.1.RELEASE</version>
</dependency>

這裏在artifactId中重複定義了本該屬於groupId的內容,所以這樣對於項目發佈來說是不規範的。

2、依賴在哪:##

因爲我們安裝maven是要配置maven主程序目錄、maven配置文件目錄、maven倉庫目錄這三個路徑的(可能ide會有自動配置,但這三個都是必不可少的)
maven主程序也就是我們下載的maven插件的根目錄;
maven配置文件路徑就在maven主程序目錄\conf\下,默認名爲setting.xml;
maven倉庫目錄也就是maven自動下載jar所存放的目錄以及我們項目發佈的本地目錄。
當我們編譯項目時一般會有如下過程:
1)編譯
2)找到pom文件,並掃描相關依賴
3)根據pom中依賴配置信息,到本地maven倉庫去查找jar包
4)如果本地沒有jar,maven會到它的中心倉庫下載jar(
1. http://www.sonatype.org/nexus/
2. http://mvnrepository.com/)
5)如果你公司創建了私服,並且你的maven中做了配置,那麼在本地沒有找到jar包時,會根據maven的配置文件(conf/setting.xml)所配置的地址,到maven的私服倉庫去尋找jar,私服也會根據它的配置規則在本地或中央倉庫查找jar,如果本地沒有就從服務端下載到本地。(私服的優點見下文)

在步驟1 中,編譯會將本地*.java編譯爲字節碼文件,其中很多jar依賴於第三方類庫,這時候IDE會根據已配置的 maven\conf\下的setting.xml文件中的配置(或IDE的maven倉庫路徑)去查找相應jar包。如果有jar包,則會拷貝到項目的編譯目錄下(myEclipse默認爲“tomcat\webapp\lib\”目錄下;Intellij IDEA 默認在“項目target\webapps\lib”目錄下),
如果本地沒有,那麼會先去倉庫下載到本地,再從本地拷貝到項目編譯目錄。
其它的下載過程最終也會下載到本地並拷貝到編譯目錄,更多詳情就不多解釋了,可自行學習。

3、生命週期:##

maven將項目的生命週期大致分爲9個,分別爲:clean、validate、compile、test、package、verify、install、site、deploy
我經常用的也就是clean、compile、package、install、deploy,而且deploy相對也較少,因爲很少發佈公共的項目供別人依賴使用,基本也就是項目打包爲war時候會打包到私服,運維人員可以到私服上直接下載對應版本。
其中clean即清除項目中編譯文件和本地倉庫中已打包的文件(即本地install的文件,install後面講到)
compile即編譯項目中的java文件,並存放在項目的編譯目錄(根據不同的配置,編譯目錄也不一樣)
test 即運行項目中的測試用例文件,如果測試用例未通過,也會打包失敗,另,這裏的test過程可以在pom中通過配置跳過。(想想也是,我項目都好了,其實不是非要跑測試用例的)
package 即將本地編譯好的文件打包爲war 或者jar(這是最常見的兩種,其他相關自行了解)
verify 我很少用到,沒怎麼了解過
install 將打包的代碼存放到本地maven倉庫,可供本地其它項目依賴使用
site生成項目報告,站點,發佈站點,這個也很少用到,不是很清楚
deploy 將打包在本地倉庫中的項目發不到服務器,供他人依賴使用
詳細生命週期自行學習瞭解。

4、私服的優點##

在上述過程中,私服的作用相當於本地的maven倉庫,但它同時又作爲服務器的角色來爲局域網用戶提供jar下載,在很多開發環境中,開發機器是不允許連接互聯網的,所以這時候maven就不能正常訪問中央倉庫下載jar文件,所以這裏的私服倉庫就顯得尤爲重要了。私服所在服務器提供了同時訪問內網和互聯網的功能,當用戶找不到jar包依賴時,可以通過內網訪問私服服務器,如果私服沒有,那麼私服會通過互聯網去中央倉庫或其它倉庫下載,這樣可以一定程度上保證開發環境的安全性。
另一方面局域網的訪問速度普遍是比互聯網快的,如果在本地沒有jar,當局域網用戶下載jar包且私服沒有時,私服的帶寬比較大便可以更快速的下載到jar並回傳到開發者本地,這樣可以保證在複雜的網絡環境或網絡不通暢的時候依然可以使用maven相關的功能。並且,當局域網中有用戶下載了相應jar包後,其它用戶再次需要該jar包時私服倉庫便可以直接從私服服務器本地直接通過局域網發送給局域網用戶,這樣大大減少了帶寬、流量並解決了很多由於網絡環境導致的問題。

注#

由於平時接觸的jar war比較多,文中很多地方對依賴或者項目打包都簡單以jar來說明,其實那些jar不單是指jar包文件,還可以是war、pom、或者項目目錄結構打包的相關類型的文件,爲了便於理解暫用jar來說明,待知識體系再完善還會進一步修改哈。I’ll be back -3-

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章