需求背景
maven的一大功能時(shí)管理項(xiàng)目依賴,為了自動(dòng)化解析任何一個(gè)java構(gòu)件,Maven就必須將它們唯一標(biāo)識(shí),這就是通過maven坐標(biāo)實(shí)現(xiàn)。
實(shí)現(xiàn)原理
maven定義了這樣一組規(guī)則:世界上任何一個(gè)構(gòu)件都可以使用maven坐標(biāo)唯一標(biāo)識(shí),坐標(biāo)元素包括:groupId、artifactId、version、packaging、classifier。只要提供正確的坐標(biāo)就能從倉庫中找到相應(yīng)的構(gòu)件供我們使用。maven從哪里下載構(gòu)件呢?答:maven內(nèi)置了一個(gè)中央倉庫的地址,該中央倉庫包含了世界上大部分流行的開源構(gòu)件。(當(dāng)然有一些構(gòu)件在倉庫中找不到,需要自己下載)
坐標(biāo)詳解
任何構(gòu)件都必須明確定義自己的坐標(biāo),而一組maven坐標(biāo)是通過一些元素定義的,他們是:groupId、artifactId、version、packaging、classifier。
先看一組坐標(biāo)定義如下:
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>
這是nexus-indexer項(xiàng)目的坐標(biāo),nexus-indexer是一個(gè)對(duì)maven倉庫編纂索引并提供搜索功能的類庫,它是Nexus項(xiàng)目的一個(gè)子模塊。
goupId: 定義了當(dāng)前maven項(xiàng)目隸屬的實(shí)際項(xiàng)目,maven項(xiàng)目和實(shí)際項(xiàng)目不一定對(duì)應(yīng),比如SpringFramework這一實(shí)際項(xiàng)目,其對(duì)應(yīng)的maven項(xiàng)目會(huì)有很多,如spring-core、spring-context等。groupId不應(yīng)該對(duì)應(yīng)到項(xiàng)目所屬公司,因?yàn)楣鞠旅鏁?huì)有好多項(xiàng)目。
artifactId:該元素定義實(shí)際項(xiàng)目中的一個(gè)maven項(xiàng)目(模塊),推薦使用實(shí)際項(xiàng)目名稱作為artifactId前綴。如上例nexus-indexer使用nexus作為前綴,這樣做的好處是方便需找實(shí)際構(gòu)件,因?yàn)閙aven生成構(gòu)件名稱默認(rèn)是以artifactId作為開頭。
version:定義maven項(xiàng)目當(dāng)前所處版本。
packaging:定義maven項(xiàng)目的打包方式,首先打包方式通常與所生成構(gòu)件的文件擴(kuò)展名對(duì)應(yīng),如packaging為jar則構(gòu)件擴(kuò)展名為jar。packaging為war最終生成以.war結(jié)尾文件,但不是絕對(duì)。其次,打包方式會(huì)影響到構(gòu)建項(xiàng)目的生命周期,比如jar打包和war打包會(huì)使用不同的命令。默認(rèn)使用jar。
classifier:該元素用來幫助定義構(gòu)件輸出的一些附屬構(gòu)件。附屬構(gòu)件與主構(gòu)件對(duì)應(yīng),如上例的主構(gòu)件是nexus-indexer-2.0.0.jar,該項(xiàng)目可能還會(huì)通過使用一些插件生成如nexus-indexer-javadoc.jar、nexus-indexer-source.jar這樣一些附屬構(gòu)件,其包含了java文檔和源代碼。這時(shí)候,javadoc和sources就是這兩個(gè)附屬構(gòu)件的classifier。這樣,附屬構(gòu)件也就擁有了自己唯一的坐標(biāo)。還有一個(gè)關(guān)于classifier的典型例子是TestNG,TestNG的主構(gòu)件是基于java1.4平臺(tái)的,而它有提供了一個(gè)classifier為jdk1.5的附屬構(gòu)件。注意,不能直接定義項(xiàng)目的classifier,因?yàn)楦綄贅?gòu)件不是項(xiàng)目直接默認(rèn)生成的,而是由附加的插件幫助生成的。主構(gòu)件是項(xiàng)目在package階段是默認(rèn)生成,而附屬構(gòu)件需要插件來完成。
上述5元素groupId、artifactId、version是必須的,packaging可選,默認(rèn)jar,classifier不能直接定義。同時(shí),項(xiàng)目構(gòu)件的文件名是與坐標(biāo)對(duì)應(yīng)的,一般的規(guī)則為artificatId-version[-classifier].packaging。packing并非一定與構(gòu)件擴(kuò)展名對(duì)應(yīng),比如packing為maven-plugin的構(gòu)件擴(kuò)展名為jar。