Maven倉庫
Maven倉庫的初中就是為了解決這個(gè)問題,是所有常用的第三方包的集中營。這樣所有的Maven項(xiàng)目就可以從這個(gè)倉庫中獲取所需要的資源,Maven倉庫中對(duì)jar通過Group Id, Atifact Id, version 來管理,所以Maven項(xiàng)目可以很方便的進(jìn)行依賴管理。你不需要自己來管理這個(gè)龐大的資源倉庫,當(dāng)然你可以創(chuàng)建一個(gè)公司層面的倉庫管理器,這個(gè)我在這個(gè)章節(jié)的后面會(huì)介紹。
Maven倉庫的兩個(gè)概念:本地倉庫和遠(yuǎn)程倉庫
本地倉庫是遠(yuǎn)程倉庫的一個(gè)緩沖和子集,當(dāng)你構(gòu)建Maven項(xiàng)目的時(shí)候,首先會(huì)從本地倉庫查找資源,如果沒有,那么Maven會(huì)從遠(yuǎn)程倉庫下載到你本地倉庫。這樣在你下次使用的時(shí)候就不需要從遠(yuǎn)程下載了。如果你所需要的jar包版本在本地倉庫沒有,而且也不存在于遠(yuǎn)程倉庫,Maven在構(gòu)建的時(shí)候會(huì)報(bào)錯(cuò),這種情況可能發(fā)生在有些jar包的新版本沒有在Maven倉庫中及時(shí)更新。 Maven缺省的本地倉庫地址為${user.home}/.m2/repository 。也就是說,一個(gè)用戶會(huì)對(duì)應(yīng)的擁有一個(gè)本地倉庫。當(dāng)然你可以通過修改${user.home}/.m2/settings.xml配置這個(gè)地址: Xml代碼 <settings> ${M2_HOME}/conf/setting.xml
還可以通過在運(yùn)行時(shí)指定目錄,但是并不推薦這么做: mvn clean install -Dmaven.repo.local=/home/juven/myrepo/ 當(dāng)我們創(chuàng)建一個(gè)簡(jiǎn)單的Maven項(xiàng)目后(只需要在pom.xml配置好依賴),運(yùn)行mvn clean install就可以把項(xiàng)目構(gòu)建好,不需要我們手工下載任何jar,這全靠中央倉庫的存在,它會(huì)自動(dòng)從倉庫下載。這個(gè)倉庫的定義是在${M2_HOME}/lib/maven-2.0.10-uber.jar里面。你可以在里面找到\org\apache\maven\project\pom-4.0.0.xml這個(gè)文件,在這個(gè)文件里面定義了中央倉庫的地址: <repositories>
下面我介紹下如何在pom.xml里面配置遠(yuǎn)程倉庫,我們需要在什么時(shí)候配置遠(yuǎn)程倉庫呢?當(dāng)你連接中央倉庫的速度比較慢時(shí),或者你為你的公司搭建了自己的倉庫,比如Nexus倉庫管理(后面我會(huì)介紹),又或者你蘇需要的jar存在另外一個(gè)公共倉庫,比如我們配置一個(gè)國內(nèi)的鏡像地址: <project>
盡管pom.xml中可以方便的哦配置中央倉庫,但是我并不推薦大家這么做,尤其是在大的公司中,因?yàn)橐粋€(gè)公司會(huì)有很多的項(xiàng)目,如果每個(gè)項(xiàng)目都這樣配置,那么又開始做重復(fù)的copy工作了,如何解決呢,我們往下走
在settings.xml中配置遠(yuǎn)程倉庫
Pom.xml的作用范圍是一個(gè)項(xiàng)目,一個(gè)公司不可能只做一個(gè)項(xiàng)目,那么為了避免重復(fù)配置,那么我們需要把一些公共信息配置在setting.xml中。但是setting.xml中并不支持<repositories>及<pluginRepositories>,為了解決這個(gè)問題我們使用profile: <settings> 在實(shí)際的操作過程中,這里我們最好不要配置遠(yuǎn)程倉庫,最好能夠通過nexus建立公司或者組織自己的倉庫,然后這把把地址指向自己的倉庫,后面我會(huì)介紹為什么要這么做,怎么做。
配置鏡像
如果你想覆蓋中央倉庫的默認(rèn)地址,那么這里我們就會(huì)使用的鏡像了,還在setting.xml里面配置: <settings>
如果你看到這里,請(qǐng)先不要著急,實(shí)際的項(xiàng)目經(jīng)驗(yàn)告訴我,只是這些還不夠,我們需要更快捷和高效的管理:
利用Nexus來構(gòu)建企業(yè)級(jí)Maven倉庫
Nexus是Maven倉庫管理器,用來搭建一個(gè)本地倉庫服務(wù)器,這樣做的好處是便于管理,節(jié)省網(wǎng)絡(luò)資源,速度快,還有一個(gè)非常有用的功能就是可以通過項(xiàng)目的SNAPSHOT版本管理,來進(jìn)行模塊間的高效依賴開發(fā),下面會(huì)一一描述。
雖然你可以通過中央倉庫來獲取你所需要的jar包,但是現(xiàn)實(shí)往往是存在很多問題: 網(wǎng)速慢,你可能需要花很長的時(shí)間來下載你所需要的jar 安裝Nexus
我們從http://nexus./downloads/ 來獲取最新版本,目前最新版本為1.3.4 Nexus提供了兩種安裝方式,一種是內(nèi)嵌Jetty的bundle,只要你有JRE就能直接運(yùn)行。第二種方式是WAR,你只須簡(jiǎn)單的將其發(fā)布到web容器中即可使用。
1)Bundle方式安裝 解壓nexus-webapp-1.3.4-bundle.zip 至任意目錄,如D:\tools ,轉(zhuǎn)到目錄D:\tools\nexus-webapp-1.3.4\bin\jsw\windows-x86-32 ,運(yùn)行Nexus.bat ,如果你是在linux下安裝,那么就下載nexus-webapp-1.3.4-bundle.tar.gz,解壓后轉(zhuǎn)到${NEXUS_HOME}/ nexus-webapp-1.3.3\bin\jsw\linux-x86-32,它還支持solaris,macos等操作系統(tǒng)。當(dāng)你看到“Started SelectChannelConnector@0.0.0.0:8081”之后,說明Nexus啟動(dòng)成功了,然后打開瀏覽器,訪問http://127.0.0.1:8081/nexus,通過admin的賬號(hào)(admin)和密碼(admin123)登錄你會(huì)看到如下的頁面:
如果有新版本發(fā)布,會(huì)有提示在默認(rèn)頁面上。 這里,可以管理倉庫,配置Nexus系統(tǒng),管理任務(wù),管理用戶,角色,權(quán)限,查看系統(tǒng)的RSS源,管理及查看系統(tǒng)日志,等等。
War方式安裝
你可以同過war的方式以web應(yīng)用的形式發(fā)布到你的應(yīng)用服務(wù)器,比如tomcat。你所要做的就是下載war版本的文件,然后放到應(yīng)用服務(wù)器的發(fā)布目錄即可,這里就不多講了。
到此我們已經(jīng)安裝好Nexus,下面我來介紹下一些我們常用的功能和使用:
配置中央倉庫
先看一下界面:
在左邊菜單欄里選擇Repositories,然后會(huì)出現(xiàn)右邊的畫面,右邊上半部分是列出來的repository,黑體字是類型為group的repository. 這里簡(jiǎn)單介紹下幾種repository的類型: hosted,本地倉庫,通常我們會(huì)部署自己的構(gòu)件到這一類型的倉庫。比如公司的第二方庫。
這里有幾個(gè)項(xiàng)目是我們可能會(huì)經(jīng)常用到的: Override local storage location: 在這個(gè)選項(xiàng)你可以配置你的Nexus本地倉庫的存放地址,用來覆蓋其默認(rèn)的存放地址 添加代理倉庫
Maven central是一個(gè)比較大的代理倉庫,如果你需要添加的一個(gè)代理倉庫,那么可以在點(diǎn)擊左邊慘淡欄里面的Repositories,然后右邊的頁面點(diǎn)擊add -> add proxy repository, 之后出現(xiàn)以下頁面:
填寫相關(guān)信息保存即可。通常情況下,使用預(yù)設(shè)的代理倉庫已經(jīng)能夠滿足大部分項(xiàng)目的需求了, 只有在特殊需求的情況下才會(huì)參加代理倉庫.
管理本地倉庫
我們前面講到類型為hosted的為本地倉庫,Nexus預(yù)定義了3個(gè)本地倉庫,分別是Releases, Snapshots, 3rd Party. 分別講一下這三個(gè)預(yù)置的倉庫都是做什么用的: Releases: 這里存放我們自己項(xiàng)目中發(fā)布的構(gòu)建, 通常是Release版本的, 比如我們自己做了一個(gè)FTP Server的項(xiàng)目, 生成的構(gòu)件為ftpserver.war, 我們就可以把這個(gè)構(gòu)建發(fā)布到Nexus的Releases本地倉庫. 關(guān)于符合發(fā)布后面會(huì)有介紹.
Maven倉庫組
倉庫組的概念是Maven沒有的,通過前面介紹可以了解到, 我們可以建立多個(gè)proxy代理倉庫,hosted本地倉庫, 如果沒有倉庫組的概念,我們?nèi)绻枰眠@些倉庫的是時(shí)候需要一一加入到我們的setting.xml里面去, 有了倉庫的組的概念, 我們只需要做一次引用就可以了,把我們需要的倉庫加入到倉庫組即可.像這樣: <repositories> <repository> <id>nexus</id> <url>http://127.0.0.1:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> Nexus中預(yù)設(shè)了2個(gè)倉庫組,public repositories和public snapshot repositories. 如圖:
這個(gè)倉庫組默認(rèn)包含本地倉庫Releases, snapshots, 3rd party和代理倉庫Maven Central. 你可以在Configuration配置頁添加倉庫到這個(gè)倉庫組. 如果需要你還可以創(chuàng)建一個(gè)倉庫組,如圖: 點(diǎn)擊 Add->Repository Group 出現(xiàn)New Repository Group界面后,填入ID, name 等相關(guān)信息, 在右邊Available Repositories 欄里可以選擇你要添加的倉庫到你新建的倉庫組.
通過Nexus搜索構(gòu)件
在我們實(shí)際使用構(gòu)件的過程中通常遇到一個(gè)問題,有時(shí)候我緊緊知道我所需要的構(gòu)建的大致名字,并不知道全稱或group id, 這是件非常頭疼的事情. Nexus基于Nexus indexer的搜索功能幫我們解決了這個(gè)問題. 要是用搜索功能, 必須要有索引文件, Nexus默認(rèn)是不建立索引文件的,因?yàn)橄裰醒雮}庫這樣的索引文件的建立需要耗費(fèi)比較大的網(wǎng)絡(luò)資源,僅索引文件就要幾十兆. 要開啟中央倉庫的索引文件下載功能需要在Maven Central的配置頁面, 把Download Remote Indexes選擇true. 如圖:
這樣設(shè)置以后, Nexus會(huì)自動(dòng)從遠(yuǎn)程中央倉庫下載索引文件, 為了檢驗(yàn)索引文件自動(dòng)下載是否生效,可以卻換到Browse:
如果出現(xiàn)先以上文件夾,那說明索引文件已經(jīng)建立. 下面我試一下搜索功能, 在左邊菜單欄里面有個(gè)Artifact Search, 在輸入框里面輸入你想要搜索的構(gòu)件名字,比如: testing, 那么查詢結(jié)果如下:
這是模糊查詢的結(jié)果,當(dāng)然如果你知道更多信息,比如版本號(hào)等,你可以使用高級(jí)搜索,點(diǎn)擊高級(jí)搜索后,右邊界面會(huì)提供集中搜索方式:keyword, classname, GAV, checksum
比如我們這里選擇GAV模式, 而且我只知道artiface name : testng和版本號(hào)5.8, 其他的我不知道, 那么就在artifact 和 version處分別輸入testng 和 5.8 , 搜索結(jié)果如下:
你如果你不知道知道構(gòu)件的名稱, 只知道classname, 那么你也可以通過class name 的方式搜索,這里就不再贅述 當(dāng)你選擇一項(xiàng)搜索結(jié)果,在頁面的下方會(huì)出現(xiàn)這個(gè)構(gòu)件的詳細(xì)信息, 并且會(huì)列出這個(gè)構(gòu)件的Maven依賴配置, 你可以直接拷貝到你的pom文件中使用,這是個(gè)非常實(shí)用的功能:
在Maven中使用Nexus 到此為止我們介紹了如何安裝和使用Nexus以及其基本配置, 下面我們介紹下如何讓Maven來使用Nexus本地倉庫用來替代使用遠(yuǎn)程倉庫. 在Maven使用Nexus本地倉庫只需稍作配置, 在settings.xml中加入以下代碼: <profile> <id>dev</id> <repositories> <repository> <id>nexus</id> <url>http://127.0.0.1:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <url>http://127.0.0.1:8081/nexus/content/groups/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles>
<activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles>
這里配置了repository和pluginRepository, Maven在使用第三方構(gòu)件和插件時(shí)是分開來配置的,所以如果我們也希望插件的下載也通過我們的本地倉庫來下載,那么我們就需要配置pluginRepository. 紅色字體部分就是我們之前安裝的Nexus的地址, 這個(gè)地址可以是你們公司局域網(wǎng)內(nèi)部的一臺(tái)倉庫服務(wù)器. <releases> <enabled>true</enabled></releases>這個(gè)標(biāo)簽的作用是設(shè)定是否允許下載 release版本的載構(gòu)件, 同樣snapshots標(biāo)簽可以設(shè)定是否允許下載snapshot版本的構(gòu)件. 通常,我們不建議下載snapshot版本的構(gòu)件,因?yàn)樗遣环€(wěn)定的版本, 除非你有特殊的需 求. 構(gòu)件部署
有些時(shí)候我們需要部署構(gòu)件到Nexus的3rd party, 比如我們?cè)谥醒雮}庫找不到我們需要的構(gòu)件, 我們可以通過Nexus的UI來上傳構(gòu)件: 點(diǎn)擊左邊菜單欄的 Repositories, 然后點(diǎn)擊右邊界面的3rd party, 選擇界面下方的Artifact Upload, 這個(gè)時(shí)候出現(xiàn)以下界面:
上傳構(gòu)件需要兩個(gè)步驟,一個(gè)是定義文件的上傳,再就是構(gòu)件的實(shí)體文件. 第一部分定義文件可以是POM文件, 這也是比較推薦的方式, 如果沒有pom文件,可以 選擇以參數(shù)的形式輸入. 第二部分是上傳構(gòu)件的實(shí)體文件,這里簡(jiǎn)單說一下Classifier和Extension, 這兩個(gè)都是選 填相, Classifier用來區(qū)別同功能的構(gòu)件用于不同的場(chǎng)景, 比如這個(gè)構(gòu)件是分別針對(duì)JDK14 和JDK15做了2個(gè)功能一樣的Jar, 這個(gè)時(shí)候你就需要指定這個(gè)構(gòu)件的Classifier為JDK14 還是JDK15. Extension是指擴(kuò)展名,如果不提供,那么會(huì)自動(dòng)取這個(gè)構(gòu)件的Packaging Type 作為擴(kuò)展名, 比如 ear, jar, war 等等. (Packaging Type是在第一步中通過pom文件或者手 工輸入得到的)
剛才說了3rd party的部署, 關(guān)于releases 和 snapshots的UI部署也是一樣的操作過程. 我們之前也講過, 這里的releases和snapshots是用來部署我們自己的項(xiàng)目構(gòu)件的, 通過 UI部署是可以,但是不是最高效的, 我們可以通過配置Maven來自動(dòng)部署我們的項(xiàng)目構(gòu) 件,這也是我們建立自己的倉庫的一個(gè)非常重要的原因, 下面就讓我們看看如何配置: 首先需要在POM文件中加入以下代碼: <project> 然后我們需要在setting.xml里面配置一下Nexus的賬號(hào)和密碼: <settings>
小結(jié) |
|