1. 程式人生 > >JAVA面試常問知識總結(十)——Maven

JAVA面試常問知識總結(十)——Maven

  • Maven有哪些優點和缺點?

優點如下:

  1. 簡化了專案依賴管理:
  2. 易於上手,對於新手可能一個"mvn clean package"命令就可能滿足他的工作
  3. 便於專案升級,無論是專案本身升級還是專案使用的依賴升級。
  4. 有助於多模組專案的開發,一個模組開發好後,釋出到倉庫,依賴該模組時可以直接從倉庫更新,而不用自己去編譯。
  5. maven有很多外掛,便於功能擴充套件,比如配置反向生成工具等

缺點如下:

  1. maven是一個龐大的構建系統,學習難度大
  2. maven採用約定優於配置的策略(convention over configuration),雖然上手容易,但是一旦出了問題,難於除錯。
  3. 當依賴很多時,m2eclipse 老是搞得Eclipse很卡。
  4. 中國的網路環境差,很多repository無法訪問,比如google code, jboss 倉庫無法訪問等。
  • Maven座標的含義?

  Maven給我們制定了一套規則——使用座標進行唯一標識。Maven的座標元素包括groupId、artifactId、version、packaging、classfier。只要我們提供正確的座標元素,Maven就能找到對應的構件,首先去你的本地倉庫查詢,沒有的話再去遠端倉庫下載。如果沒有配置遠端倉庫,會預設從中央倉庫地址(http://repo1.maven.org/maven2)下載構件,該中央倉庫包含了世界上大部分流行的開源專案構件,但不一定所有構件都有。

   在我們自己開發專案的時候,也是要給我們的專案定義座標的,這是強制性要求,只有這樣,其他專案才能引用該專案的構件。

  

  

groupId :定義當前Maven專案隸屬的實際專案。首先,Maven專案和實際專案不一定是一對一的關係。比如SpringFrameWork這一實際專案,其對應的Maven專案會有很多,如spring-core,spring-context等。這是由於Maven中模組的概念,因此,一個實際專案往往會被劃分成很多模組。其次,groupId不應該對應專案隸屬的組織或公司。原因很簡單,一個組織下會有很多實際專案,如果groupId只定義到組織級別,而後面我們會看到,artifactId只能定義Maven專案(模組),那麼實際專案這個層次將難以定義。最後,groupId的表示方式與Java包名的表達方式類似,通常與域名反向一一對應。上例中,groupId為junit,是不是感覺很特殊,這樣也是可以的,因為全世界就這麼個junit,它也沒有很多分支。

 

artifactId : 該元素定義當前實際專案中的一個Maven專案(模組),推薦的做法是使用實際專案名稱作為artifactId的字首。比如上例中的junit,junit就是實際的專案名稱,方便而且直觀。在預設情況下,maven生成的構件,會以artifactId作為檔案頭,如junit-3.8.1.jar,使用實際專案名稱作為字首,就能方便的從本地倉庫找到某個專案的構件。

 

version : 該元素定義了使用構件的版本,如上例中junit的版本是3.8.1,你也可以改為4.0表示使用4.0版本的junit。

 

packaging :定義Maven專案打包的方式,使用構件的什麼包。首先,打包方式通常與所生成構件的副檔名對應,如上例中沒有packaging,則預設為jar包,最終的檔名為junit-3.8.1.jar。也可以打包成war等。

 

classifier: 該元素用來幫助定義構建輸出的一些附件。附屬構件與主構件對應,如上例中的主構件為junit-3.8.1.jar,該專案可能還會通過一些外掛生成如junit-3.8.1-javadoc.jar,junit-3.8.1-sources.jar, 這樣附屬構件也就擁有了自己唯一的座標。

 

上述5個元素中,groupId、artifactId、version是必須定義的,packaging是可選的(預設為jar),而classfier是不能直接定義的,需要結合外掛使用。