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是 maven 。
playbook:
$ cat maven.yml
---
- hosts: ucloud
gather_facts: False
roles:
- role: maven
使用方法:
$ ansible-playbook maven.yml
安裝Nexus
官方建議 服務器硬件配置:
- CPU:≥4核
- memory:≥4G (do not set max heap size larger than 4GB)
- fd:65536
安裝依賴
- 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