Maven的一個核心的作用就是管理項目的依賴,引入我們所需的各種jar包等。為了能自動化的解析任何一個Java構件,Maven必須將這些Jar包或者其他資源進行唯一標識,這是管理項目的依賴的基礎,也就是我們要說的坐標。包括我們自己開發的項目,也是要通過坐標進行唯一標識的,這樣才能才其它項目中進行依賴 ...
Maven的一個核心的作用就是管理項目的依賴,引入我們所需的各種jar包等。為了能自動化的解析任何一個Java構件,Maven必須將這些Jar包或者其他資源進行唯一標識,這是管理項目的依賴的基礎,也就是我們要說的坐標。包括我們自己開發的項目,也是要通過坐標進行唯一標識的,這樣才能才其它項目中進行依賴引用。
1.何為Maven坐標
關於坐標(Coordinate),大家最熟悉的應該就是數學中的坐標了吧,我印象不是特別深刻,說的數學專業一點叫作平面幾何。在一個平面坐標系中,有x軸和y軸,x軸就是橫線,y軸就是豎線,坐標(x,y)表示這個點距離x軸為y,距離y軸為x的一點,任何一個坐標都能唯一標識該平面中的一點。
在實際的生活中,我們可以將地址看成是一種坐標。不同的省,不同的市,不同的區,不同的街道等一系列信息標識了每一個不同的地址。在深圳經常吃外賣的人應該是有體會的,送外賣的小哥都會根據你填寫的地址將外賣送給你,而你填的地址就標識了唯一的一個地址。
坐標就好比每一個Java構件的身份證一樣。Maven的世界是擁有非常多的Java構件的,可能是jar、可能是war、也可能是其他的一些東西。假如Maven中沒有坐標的概念,我們是無法來區分這些構件的,所以我們要唯一標識每一個構件。不然就和傳統的手工方式一樣,你需要spring就去spring下載spring的包,需要mysql又去mysql下載mysql的包,沒有統一的規範又怎麼能夠自動化的去依賴這些構件。
Maven便給我們制定了一套規則那就是使用坐標進行唯一標識。Maven的坐標元素包括groupId、artifactId、version、packaging、classfier。只要我們提供正確的坐標元素,Maven就能找到對應的構件,首先去你的本地倉庫查找,沒有的話再去遠程倉庫下載。如果沒有配置遠程倉庫,會預設從中央倉庫地址(http://repo1.maven.org/maven2)下載構件,該中央倉庫包含了世界上大部分流行的開源項目構件,但不一定所有構件都有,我在以前的開發中就遇到過找不到oracle資料庫jar包的問題,不知道現在是否依然如此。
在我們自己開發項目的時候,也是要給我們的項目定義坐標的,這是強制性要求,只有這樣,其他項目才能引用該項目的構件。
2.坐標詳細說明
Maven坐標是通過groupId、artifactId、version、packaging、classfier這些元素來定義的,我們來看看示例:
我們在平時的開發中一般只需要使用必要的幾個元素就好了,不必要的一些元素往往是用不著的,我們來看看每個元素所代表的含義,前面也是有簡單的提到過的。
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是不能直接定義的,需要結合插件使用。
大家可以發現一個構件的名稱就是由這幾個元素的值所組成的,junit-3.8.1.jar,自己去比對一下,不僅如此,Maven倉庫的佈局也是基於Maven坐標的,大家可以看看本地倉庫的佈局是否如此。
理解了Maven坐標以後,大家就能夠開始去學習Maven的依賴管理了。