Sonatype Nexus私服倉庫
1、安裝
官網地址:https://www.sonatype.com/
打開zip包之後,目錄結構如下:
我們只需要將nexus-2.0.6拷貝到需要安裝的路徑即可,比如在我的機器上,我copy到了D:maven目錄下,sonatype-work可以不拷貝。
很簡單,這就安裝完了。
2、啟動
nexus已經將各個平台的啟動腳本都寫好了,並分開目錄放置,具體可以查看nexus-2.06injsw目錄,我的機器是windows32位的,就可以進入到windows-x86-32目錄下,點擊console-nexus.bat即可啟動,啟動完成後,訪問url:http://localhost:8081/nexus即可看到nexus的頁面。
如果是其他平台,找到對應的目錄啟動腳本即可。
到這裡為止,我們的nexus就已經啟動起來了。
3、配置
我們啟動了nexus後,可以通過瀏覽器訪問到nexus的管理界面:http://localhost:8081/nexus。
管理員登陸密碼默認為:admin/admin123,UI界面是Ext來搭建的,操作起來沒有什麼障礙,而且界面看起來很清爽。
登錄成功後看到如下界面:
左側分為4部分,其中views/repositories是倉庫相關的管理項;security是安全許可權相關的;administrotr是管理相關的;help是幫助相關的。
3.1 倉庫配置
點擊左側的「views/repositories–>repositories」,右邊列出來了nexus默認的倉庫
其中有四種類型的倉庫,分別是hosted、proxy、virtual、group。
hosted,宿主型的,實實在在由nexus給管理的倉庫,nexus自帶了3個宿主倉庫 proxy,代理型的,每個倉庫都是對一個遠程倉庫的代理,這其中就包括了對中央倉庫的代理。virtual,虛擬型的,這個不太了解,就不說了group,嚴格來說它不是一個倉庫,顧名思義,是組的意思,它相當於是由多個倉庫合成了一個組,由該組的url對外提供服務,nexus默認有兩個組,一個是public group,其中包含了上邊的3個宿主倉庫和中央倉庫;另一個是public snapshots group,裡邊包含了Apache Snapshots和CodeHaus Sanpshots。當然這些組包含的內容是可以修改的。同時,nexus提供了增加、刪除、修改倉庫定義的功能。3.2 打開遠程索引下載
巨大的用戶訪問中央倉庫會帶來巨大的網路壓力和伺服器壓力,因此在nexus中默認的各個代理倉庫的索引都是關閉狀態,即安裝完nexus后里邊是空的,什麼東東都沒有,包括索引。我們現在要做的就是需要把這個索引給下載到nexus伺服器中,以便使用者可以從nexus中搜索到相關構建。
方法如下:選中中央倉庫這條記錄,即名字為central的倉庫
下邊選中configuration選項卡,找到其中的Download Remote Indexes,把fasle改為true,並保存。在上邊的中央倉庫記錄上點擊右鍵,選擇update index 然後在下邊選中Browse Index選項卡,打開central這顆樹的節點,應該能看到內容。在下載索引之前是空的。其他的proxy類型的倉庫,都可以用同樣的方法來下載索引。注意:這一步僅僅是下載了遠程倉庫的索引,真正的構件還沒有下載到nexus中。等真正有實際用戶使用這些構件的時候,才會從中央倉庫下載真正的構件文件。有的遠程倉庫沒有索引文件而不能下載索引文件,但只要Browse Remote中能看到包,即使Browse Index看不到也能通過maven依賴下載下來,下載後就能在nexus中搜索到該包了。3.1.3 搜索構件
在使用maven之前,如果我們的項目中需要使用一個jar包,我們一般會怎麼做呢?舉個例子,我們要使用dom4j這個包,那麼我們一般要去官方網站下載或者去baidu、google裡邊直接搜索,版本呢只能逮到哪個是哪個了。這種情況如果找一個兩個jar還行,如果多了將會帶來巨大的工作量,而且還非常容易導致缺包、衝突等問題。
現在有了maven,工作將會變的非常簡單。還拿找dom4j這個jar來舉例子,在nexus的頁面中搜索「dom4j」這個詞,看如下結果
左側的搜索框輸入了dom4j,右側上方出現了所有包含dom4j的項目,假如我們需要1.6.1版本的dom4j的jar,那麼點擊相應的條目在下方就會列出來。搜索到之後怎麼用呢?右側給出了依賴xml格式的數據,只需要將該xml copy到你的pom.xml中,那麼你的項目將會自動從nexus下載(註:項目中配置nexus的方法還沒說,下一節細說)。
說到這裡,可能會有疑問,那假如說我的項目需要A.jar,但是A.jar又依賴B.jar,那我是不是還要依次去找所有的依賴jar呢?答案是否定的,maven已經給你提供了最簡單的方法,只要你依賴了A.jar,那麼A.jar所需要的所有jar它將自動幫你查找下載。怎麼樣,省事了很多吧。
3.1.4 創建倉庫我們來做一個創建proxy類型的倉庫,點擊倉庫裡邊上方的「Add….—>Proxy Repository」
Id是唯一的,輸入一個名字,Remote Storage Location輸入jboss的maven倉庫地址,下邊的代理相關的設置根據自己的情況來確定,輸入完後點擊保存即可。創建完成後按照3.1.2節提供的方法下載索引即可。
3.1.5組管理組是若干倉庫的一個集合,那麼如何來管理組中包含的倉庫呢?看下圖:
選中public group這條記錄,選中下方的configuration選項卡,左側列出了已經選擇的倉庫列表,右邊是可選的,通過中間的箭頭來控制倉庫列表信息。
主要是對nexus中資源的授權管理。
security–>Change Password,修改當前用戶的密碼;security–>Privilege,許可權點管理;security–>Roles,角色管理;security–>Users,用戶管理這幾項都是標準的許可權管理,很簡單,就不再多說了。3.3.管理相關3.3.1代理設置
如果nexus伺服器上網需要設置代理,那麼需要在Administrator–>Server中設置,如下圖所示:
大概說了這麼多,都是比較常用的了。
4.項目中配置使用nexus
上一節,我們討論了nexus的管理與配置。那麼,當nexus配置完了之後,就相當於我們本地項目與maven中央倉庫這個橋樑已經搭好了,剩下的就是看怎麼通過怎樣的配置來使用nexus。在本地開發的時候,主要牽涉到兩個配置文件,一個是settings.xml(%M2_HOME%/conf/settings.xml和%USER_HOME%.m2settings.xml),一個是項目中的pom.xml。所有的主要配置都集中在這兩個配置文件中,下邊咱們就通過一個實際的項目的例子來說說這兩個配置文件的用法。
4.1 項目描述
我們先從這個項目開始說起。onlinestore是一個主項目,onlinestore-core、onlinestore-interf、onlinestore-chinaweb、onlinestore-americaweb是onlinestore的4個子項目(其中前兩個是java項目,後邊兩個是web項目)。在這裡說子項目,可能大家還有些不太習慣或者不太好理解,這個子與父的關係,我們在後邊會再說。注意:這裡我起的在線商店這個項目,裡邊沒有什麼實質性的代碼,只是講的框架和主要的配置文件。下邊截圖是這幾個項目的工程結構圖:
在圖中我們可以看到父項目和子項目在MyEclipse裡邊是平級的關係,在磁碟的目錄結構中,子項目在父項目所在的文件夾中,如下圖:
其實在這兩個截圖中,都看不出裡邊的父子關係,真正的父子關係,在哪裡定義呢?在pom.xml文件中,我們打開父項目的pom.xml文件,裡邊可以找到:
<modules>
<module>onlinestore-core</module>
<module>onlinestore-interf</module> <module>onlinestore-chinaweb</module> <module>onlinestore-americaweb</module> </modules>另外,在4個子項目的pom.xml的文件中,也能找到類似的:
<parent>
<artifactId>parent</artifactId> <groupId>com.uuwit.onlinestore</groupId> <version>0.0.1-SNAPSHOT</version></parent>
也就是說,在父項目和子項目中,都有說明他們之間的關係。
說到這裡,咱們說一下為什麼要創建父項目和子項目,他們之間到底有著什麼樣的聯繫。通常一個大的項目會將項目分成多個模塊,比如上邊咱們舉的例子,core是項目的一些核心類或者組件,interf放介面類,其餘兩個分別是兩個相對獨立的web模塊。正常情況下,兩個web模塊比如會依賴core和interf這兩個項目。而兩個web項目之間通常並不會有依賴關係,但是他們之間卻有很多共性的東西,比如說很多類似的配置、很多類似的jar包等等,這時候父項目和子項目的優勢就能體現出來了。我們知道maven父項目和子項目的pom.xml是有繼承關係的,也就是說各個模塊相同的部分,我們可以配置到父項目的pom.xml文件中,這樣子項目中的pom.xml只放自己個性的東西就可以了,這大大減少了工作量。另外,在編譯和打包等其他階段,都可以統一在父項目中來進行,maven會自動操作其中的子項目,提高了效率。
【注意:】事實上,所有的maven項目都會繼承一個超級pom,這個pom就是%M2_HOME%libmaven-2.2.1-uber.jar中的orgapachemavenprojectpom-4.0.0.xml。
4.2 配置nexus我們知道,我們架設倉庫管理器的目的是為了減少與中央倉庫的交互,既然這樣,那我們在本地肯定要配置nexus的相關信息,以便能夠把中央倉庫的配置覆蓋掉,從而真正來使用nexus。
兩個步驟:
1.打開settings.xml文件:
<mirrors>
<!– mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.|–><mirror> <id>nexus-public-snapshots</id> <mirrorOf>public-snapshots</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public-snapshots</url></mirror><mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public</url></mirror></mirrors>找到mirrors標籤,在其中添加上邊的配置,其中的localhots:8081根據自己的具體情況修改。
2.打開父項目的pom.xml文件,添加如下配置:
<distributionManagement>
<repository> <id>repo</id> <name>public</name> <url>http://localhost:8081/nexus/content/repositories/releases</url> </repository> <snapshotRepository> <id>snapshots</id> <name>Snapshots</name> <url>http://localhost:8081/nexus/content/repositories/snapshots</url> </snapshotRepository></distributionManagement>
其中的localhots:8081根據自己的具體情況修改。
好了,就這麼簡單,就配置好了,如何驗證一下項目真的不去找中央倉庫的麻煩了呢?可以這麼測試一下,你把你項目中使用到的一些構件在本地的maven倉庫刪除掉,然後再編譯一下項目,在控制台列印的日誌中,你能夠清晰的看到都是從nexus中downlaod的,而在之前都是列印從中央倉庫獲取的。
4.3 java項目的幾個操作3.1編譯mvn compile,編譯java項目,java文件將會被編譯成class文件放到target/classes目錄下
3.2打包mvn package,打包java項目,項目將會打包成jar文件放到target目錄下,jar文件的命名規則是:${project.artifactId}-${project.version}.jar
3.3安裝安裝的作用是將打包好的jar文件安裝到本地的mavan倉庫中,以供其他項目(如果其他項目依賴該項目的話)使用。
mvn install,在maven倉庫中存放的目錄結構是:${project.groupId}–>${project.artifactId}–>${project.version}
3.4部署部署的作用是將打包好的jar文件上傳到nexus中,以供其他同伴(如果其他同伴依賴該項目的話)使用。
mvn deploy,在這裡要注意,在部署的時候,會提示401錯誤,此時你需要在setting.xml文件中添加鑒權信息,即在部署的時候需要使用nexus給分配的賬戶來上傳。
在settings.xml中找到servers標籤,在其中添加如下配置:
<server>
<id>repo</id><username>admin</username><password>admin123</password></server><server>
<id>snapshots</id><username>admin</username><password>admin123</password></server>其中的用戶名和密碼是nexus分配的,其中的id一定要和父項目中pom.xml文件中剛才配置的repository和snapshotRepository的id一致。
4.4 web項目的幾個操作先貼一下web項目的pom.xml的build標籤:
<build>
<finalName>onlinestore-chinaweb</finalName> <outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.4.3</version> <configuration> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin><!– <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.7.2</version> <configuration> <parallel>methods</parallel> <threadCount>10</threadCount> <argLine>-Dfile.encoding=UTF-8</argLine> <skip>true</skip> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> <plugin> <groupId>maven</groupId> <artifactId>maven-clover-plugin</artifactId> <version>2.4.2</version> <configuration> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin>–> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <encoding>${project.build.sourceEncoding}</encoding> <warName>onlinestore-chinaweb</warName> <attachClasses>true</attachClasses> <classesClassifier>classes</classesClassifier> <warSourceDirectory>src/main/webapp</warSourceDirectory> <webappDirectory>${project.build.directory}/onlinestore-chinaweb</webappDirectory> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <configuration> <charset>${project.build.sourceEncoding}</charset> <url>http://localhost:8080/manager</url> <!– <server>tomcat.server</server> –> <path>/onlinestore-chinaweb</path> <port>8080</port> <warSourceDirectory>src/main/webapp</warSourceDirectory> <warFile>${project.build.directory}/onlinestore-chinaweb.war</warFile> <uriEncoding>${project.build.sourceEncoding}</uriEncoding></configuration>
</plugin></plugins></build>4.4.1 全局配置outputDirectory要重新指定,指定到src/main/webapp/WEB-INF/classes目錄下,否則默認會是在test/classes目錄4.4.2 war插件配置比較簡單,不再累述。
4.4.3 tomcat插件tomcat插件可以讓你不使用外部的tomcat,而使用起內嵌的tomcat,這樣更省勁,更簡單。如果你不想使用內嵌的tomcat,也可以單獨指定,需要在<configuration>標籤中指定tomcat的server的id,這個id也需要在settings.xml中的servers標籤中定義。其中的tomcat埠可以自己指定。
推薦閱讀:
※區塊鏈生態系統的邏輯
※【翻譯】LD的自我修養:從零開始製作一張CS:GO地圖(一)
※Battle Royale邏輯+遊戲閱歷對產品開發的意義
※解謎與殘局——策略戰棋的魅力
※DOTA2:夏日特惠修復兩次購買「BUG」獎金池難超TI7,猜測一下坑錢計劃