Maven基礎教程之座標
前言
看完上一篇《Maven基礎教程之使用入門 》後,大家基本上就會使用Maven了,但是Maven遠不止上一篇文章中總結的那麼一點東西,還有很多其他非常重要的概念,而這些概念就是我們深入理解Maven,學習Maven原理的重點,從這一篇文章開始,我將開始重點總結Maven中的一些重點概念和原理性的東西,通過這些重要的概念和原理性的東西,讓大家知其然,也知其所以然。
Maven座標是什麼?
在初中的數學幾何中,我們知道,平面中任何一個座標都可以唯一標識該平面中的一個點。對於Maven世界中,有數量巨大的JAR包或者WAR包,在還沒有座標這個概念前,我們是如何引入我們專案需要的依賴呢?比如我現在建立了一個Spring的專案,此時我就要去Spring官網下載Spring相關的JAR包,放到我的專案Classpath下面去;當需要Mybatis相關的JAR包時,我再去Mybatis的官網下載對應的JAR包,再放到Classpath中去。也就是說,我們缺少什麼JAR包,就去網上下載對應的JAR包,而很多時候,我們只有在編譯出現錯誤時,我們才知道我們到底缺了哪些依賴的JAR包,所以這樣的工作就讓我們很被動,同時又沒法進行流程自動化。
問題丟擲來了,我們要相信這個世界上大牛的能力,沒有解決不了的問題。基於這些難題,Maven就定義了這樣一組規則來搞定它。
世界上任何一個JAR包或者WAR包都可以使用Maven座標唯一標識,Maven座標的元素包括groupId、artifactId、version和classifier等。只要我們提供了正確的座標元素,Maven就能找到對應的JAR包或者WAR包。
就是這麼簡單的。所以,在我們開發自己的專案時,Maven也強制要求我們需要為專案指定適當的座標,這樣其它的Maven專案才能引用對應專案生成的JAR包或者WAR包。
細說Maven座標
Maven座標就是定義了一種規則,任何基於Maven開發的專案都需要遵守這個規則,也就是需要明確定義自己的座標,我們可以看一下上一篇文章中pom.xml檔案裡的那個示例:
<groupId>com.jellythink.HelloWorld</groupId> <artifactId>hello-world</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
上面程式碼中,關於座標的各個座標元素,這裡重點說明一下:
-
groupId
:定義當前Maven專案隸屬的實際專案;我們要明白的是Maven專案和實際專案不一定是一對一的關係。舉一個最常見的例子,比如Spring Framework這個實際專案,其對應的Maven專案會有很多,如spring-core、spring-context等。這是由於Maven中模組的概念,因此實際專案往往會被劃分成很多模組。當我們看到一個專案的groupId時,會覺的很熟悉,為什麼?是不是和我們經常定義的Java包名很像,這個和我們在Java中定義頂級包名的規則是一樣的,通常與公司或者組織的域名反向一一對應。 -
artifactId
:該元素定義實際專案中的一個Maven專案(模組),一般推薦的做法是使用實際專案名稱作為artifactId的字首,比如spring-core的字首是spring一樣。 -
version
:該元素定義Maven專案當前所處的版本;在Maven中定義了一整套完整的版本定義規範,後續會有專門的文章進行總結。 -
packaging
:該元素定義Maven專案的打包方式;打包方式通常與所編譯生成的副檔名對應,但也不是絕對的,比如packaging為maven-plugin的構件副檔名為jar;packaging常見的是jar和war這兩種型別;不同的打包方式會影響到構建的生命週期。很多時候,我們也會看到我們沒有定義這個packaging元素,此時Maven會使用預設值jar。 -
classifier
:該元素用來幫助定義輸出一些附屬檔案。附屬輸出檔案與主輸出檔案是對應的,比如上面的主輸出檔案是hello-world-1.0-SNAPSHOT.jar,該專案可能還會通過使用一些外掛生成如hello-world-1.0-SNAPSHOT-javadoc.jar、hello-world-1.0-SNAPSHOT-sources.jar這樣的一些附屬輸出檔案。需要我們注意的是,不能直接定義專案的classifier,因為附屬輸出檔案不是專案直接預設生成的,而是由附加的外掛幫助生成的。
總結
到這裡,關於Maven座標的相關知識就整理完了,回過頭來看,你會發現Maven中的座標是一個非常好理解,但是卻又非常重要,非常基礎的一個概念。不懂這個座標的概念,可能最後連pom.xml檔案都看不懂,再往下的學習也就都是白搭,最後,慶幸的是這個還不是很難學習,至少看懂我這裡總結的應該木有問題;不過能看懂我這裡總結的,也就OK了。
果凍想,認真玩技術的地方。
2019年4月3日,於內蒙古呼和浩特。