原 薦 Maven and Nexus2
Maven and Nexus2
Maven是什麼?
-
構建工具:通過簡單的命令,能夠完成清理、編譯、測試、打包、部署等一系列過程。同時,不得不提的是,Maven是跨平臺的,無論是在Windows、還是在Linux或Mac上,都可以使用同樣的命令。
-
依賴管理工具:
專案依賴的第三方的開源類庫,都可以通過依賴的方式引入到專案中來。代替了原來需要首先下載第三方jar,再加入到專案中的方式。從而更好的解決了合作開發中依賴增多、版本不一致、版本衝突、依賴臃腫等問題。
-
專案資訊管理工具:能夠管理專案描述、開發者列表、版本控制系統地址、許可證等一些比較零散的專案資訊。除了直接的專案資訊,通過Maven自動生成的站點,以及一些已有的外掛,還能夠輕鬆獲得專案文件、測試報告、靜態分析報告、原始碼版本、日誌報告等非常具有價值的專案資訊。
Maven V·S Nexus
這個問題從Maven的第二個用處說起,依賴管理,通過在Pom中指定座標的形式將jar引入到專案中。那這個過程,要經歷怎樣一個流程呢?從哪裡尋找jar?下載的jar放到哪裡?
將這個問題順下來,就知道nexus和maven的關係了。
從哪裡找到jar?專案用到的jar又存放在哪裡?這引出了倉庫的概念,maven通過倉庫來統一管理各種構件。Maven的倉庫分為本地倉庫和遠端倉庫。
當Maven根據座標尋找構件時,它首先會檢視本地倉庫,如果本地倉庫存在此構件,則直接使用;如果本地倉庫不存在此構件,或者需要檢視是否有更新的構件版本,Maven會去遠端倉庫查詢,發現需要的構件之後,下載到本地倉庫再使用。
到了這裡,問題的答案也就出來了。
首先,Nexus是一種遠端倉庫,根據上段的介紹,我們已經知道遠端倉庫的作用。在遠端倉庫中,預設的是中央倉庫,中央倉庫是Maven核心自帶的遠端倉庫。那就使用中央倉庫不就得了嗎, 為什麼我們要安裝Nexus呢?
我們從專案實際開發來看:
- 如果沒有私服,我們所需的所有構件都需要通過maven的中央倉庫和第三方的Maven倉庫下載到本地,而一個團隊中的所有人都重複的從maven倉庫下載構件無疑加大了倉庫的負載和浪費了外網頻寬,如果網速慢的話,還會影響專案的程序。
- 很多情況下專案的開發都是在內網進行的,連線不到maven倉庫怎麼辦呢?開發的公共構件怎麼讓其它專案使用?這個時候我們不得不為自己的團隊搭建屬於自己的maven私服,這樣既節省了網路頻寬也會加速專案搭建的程序,當然前提條件就是你的私服中擁有專案所需的所有構件。
- 為了節省頻寬和時間,在區域網內架設一個私有的倉庫伺服器,用其代理所有外部的遠端倉庫。當本地Maven專案需要下載構件時,先去私服請求,如果私服沒有,則再去遠端倉庫請求,從遠端倉庫下載構件後,把構件快取在私服上。這樣,及時暫時沒有Internet連結,由於私服已經快取了大量構件,整個專案還是可以正常使用的。同時,也降低了中央倉庫的負荷。
Nexus僅僅是私服的一種。
通過上面說明如果還不能理解maven和nexus是什麼,可以對比一下yum倉庫以及本地yum源,maven只不過是將/etc/yum.repos.d/*.repo源換做專案中的pom.xml呼叫的jar源。
安裝及配置
安裝Maven
在centos7系統安裝maven很簡單,直接使用yum安裝就可以,不過在安裝maven之前首先要配置系統的 JDK (java)環境。春雨使用ansible進行部署,對應的role是 ofollow,noindex" target="_blank">maven 。
playbook:
$ cat maven.yml --- - hosts: ucloud gather_facts: False roles: - role: maven
使用方法:
$ ansible-playbook maven.yml
安裝Nexus
Java" rel="nofollow,noindex" target="_blank">官方建議 伺服器硬體配置:
安裝依賴
- Java 8
- maven
- npm
Java和maven在上面的過程已安裝,接下來只需要安裝npm,步驟如下:
# 安裝之前先建立對應的目錄 $ mkdir /home/node $ cd /home/node # 使用nodejs管理npm $ wget https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.xz # 解壓 $ tar Jxvf node-v8.12.0-linux-x64.tar.xz $ mv node-v8.12.0-linux-x64 nodejs # 加入系統環境 $ ln -s /home/node/nodejs/bin/node /usr/bin/node $ ln -s /home/node/nodejs/bin/npm /usr/bin/npm # 升級npm $ npm install npm@latest -g
安裝Nexus2
$ cd /usr/local/ $ wget https://download.sonatype.com/nexus/oss/nexus-2.13.0-01-bundle.tar.gz $ tar xvzf nexus-2.13.0-01-bundle.tar.gz $ ln -s nexus-2.13.0-01 nexus ## nexus-2.13.0-01:應用目錄 ## sonatype-work:資料目錄,存放所有的repo # 啟動 $ cd /usr/local/nexus/bin/ $ ./nexus start **************************************** WARNING - NOT RECOMMENDED TO RUN AS ROOT **************************************** If you insist running as root, then set the environment variable RUN_AS_USER=root before running this script. $ vim /usr/local/nexus/bin/nexus RUN_AS_USER=root $./nexus start **************************************** WARNING - NOT RECOMMENDED TO RUN AS ROOT **************************************** Starting Nexus OSS... Started Nexus OSS. $ tail -f /usr/local/nexus/logs/wrapper.log
啟動成功後在瀏覽器訪問(localhost:8081/nexus/): http://192.168.228.130:8081/nexus/ ,進入web介面
使用管理員使用者登入,賬號:admin 密碼:admin123。如果使用sonatype管理使用者和密碼,可以通過設定——change password來更改密碼,如果集成了ldap使用者,則無法通過此方法更改密碼。
-
系統優化:
sonatype需要配置系統檔案描述符數量為 65536,配置方法如下:
# 檢視當前系統可開啟檔案描述符數量 $ ulimit -n # 修改檔案描述符數量 ## 臨時修改 $ ulimit -n 65535 ## 永久修改 $ vim /etc/security/limits.conf nexus - nofile 65536
如果 加入了systemd管理 nexus,上述方法是不生效的,配置方法如下:
# 加入systemd管理 $ vim /usr/lib/systemd/system/nexus.service [Unit] Description=nexus service After=network.target [Service] Type=forking LimitNOFILE=65536 ExecStart=/usr/local/nexus/bin/nexus start ExecStop=/usr/local/nexus/bin/nexus stop Restart=on-abort [Install] WantedBy=multi-user.target
管理nexus服務:
$ systemctl daemon-reload $ systemctl start nexus
整合ldap
Nexus管理
Nexus倉庫型別
- hosted 宿主倉庫:主要用於部署無法從公共倉庫獲取的構件(如 oracle 的 JDBC 驅動)以及自己或第三方的專案構件;
- proxy 代理倉庫:代理公共的遠端倉庫;
- virtual 虛擬倉庫:用於適配 Maven 1;
- group 倉庫組:Nexus 通過倉庫組的概念統一管理多個倉庫,這樣我們在專案中直接請求倉庫組即可請求到倉庫組管理的多個倉庫。
倉庫常見操作
- 修改預設儲存路徑
- 同步索引
- 修改遠端同步地址為aliyun映象地址
代理maven-proxy
-
更改maven配置 編輯maven的settings.xml檔案,更改mirror、profile、activeProfiles模組的內容如下:
$ vim /etc/maven/settings.xml <settings> <mirrors> <mirror> <!--This sends everything else to /public --> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/repository/maven-proxy/</url> </mirror> </mirrors> <profiles> <profile> <id>nexus</id> <!--Enable snapshots for the built in central repo to direct --> <!--all requests to nexus via the mirror --> <repositories> <repository> <id>central</id> <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <!--make the profile active all the time --> <activeProfile>nexus</activeProfile> </activeProfiles> </settings>
-
進入web,配置nexus:
-
在專案中呼叫(pom.xml): http://maven.apache.org/guides/mini/guide-mirror-settings.html