Maven 是一個項目管理和構建自動化工具,是Apache Fundation下的一個Java項目。常用於Java項目中依賴管理
下載直接去官網
安裝Maven
已經編譯的二進制包 直接解壓到安裝目錄即可
$ cd /path/to/Download $ tar -xf apache-maven-3.3.9-bin.tar.gz $ sudo mv apache-maven-3.3.9 /usr/local/ $ sudo ln -s /usr/local/apache-maven-3.3.9/bin/* /usr/bin/
maven會首先查詢 pom.xml
引入的包,查找本地倉庫是及工程目錄,如不存在相應的包就會從maven的遠程apache倉庫下載
打包工程
mvn package
發布包到本地倉庫
mvn install
Nexus OSS
Nexus是一個強大的Maven倉庫管理器,它極大地簡化了自己內部倉庫的維護和外部倉庫的訪問。利用Nexus你可以只在一個地方就能夠完全控制訪問 和部署在你所維護倉庫中的每個Artifact。Nexus是一套“開箱即用”的系統不需要數據庫,它使用文件系統加Lucene來組織數據。Nexus 使用ExtJS來開發界面,利用Restlet來提供完整的REST APIs,通過m2eclipse與Eclipse集成使用。Nexus支持WebDAV與LDAP安全身份認證。 Nexus分為專業收費的Nexus Pro與免費的Nexus OSS兩個版本。本文以Nexus OSS為主體
安裝與配置
下載Nexus OSS Nexus OSS 3.0 已經不支持Maven格式,所以這里我們下載 2.x 版本, 下載地址
安裝Nexus OSS
$ cd /path/to/Downloads $ tar -xf nexus-2.14.1-01-bundle.tar.gz $ cd nexus-2.14.1-01-bundle $ sudo mv nexus-2.14.1-01 /usr/local/ # 建立倉庫存放目的 $ sudo mkdir /Data $ sudo mv sonatype-work /Data/ # 建立bin運行軟鏈 # sudo ln -s /usr/local/nexus /usr/local/nexus-2.14.1-01 # sudo ln -s /usr/loca/nexus-2.14.1-01/bin/nexus /usr/local/bin/
配置Nexus OSS
$ cd /usr/local/nexus-2.14.1-01/conf $ sudo vim nexus-propertities # 修改以下內容 nexus-work=/Data/nexus-repos/sonatype-work/nexus
測試運行
$ nexus start # 停止 $ nexus stop # 重啟 $ nexus restart
瀏覽器打開http://localhost:8081/nexus
,即可看到nexus oss的歡迎界面
登錄用戶:admin,默認密碼:admin123,登錄后可在個人中心修改。
nginx反代方式
$ cd /path/to/nginx/conf/vhosts $ sudo vim nexus.local.me.conf # 內容如下: server { server_name nexus.aeonluck.me; location / { proxy_pass http://127.0.0.1:8081; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
添加本地host
# sudo vim /etc/hosts # 增加以下內容 127.0.0.1 nexus.local.me
測試反代
$ sudo nginx -s reload
瀏覽器打開http://nexus.local.me/nexus
即可見到nexus oss歡迎界面
倉庫配置
Nexus的倉庫分為以下幾種:
- proxy : 代理倉庫,對遠程倉庫的本地代理。
- hosted : 本地倉庫。
- virtual:影子倉庫,對proxy或hosted倉庫的映射。
- group:倉庫組,作為邏輯倉庫組對外
首先,我們要對幾個重要倉庫的配置進行修改,如 central
,Apache Snapshots
等,你也可以自己添加外部倉庫。
- 點擊左側 repositories,右側打開倉庫列表。
- 選擇倉庫 central,點擊下方 configuration,找到 “Download Remote Indexes”,修改為 true,保存。
- 右擊倉庫列表中 central,選擇 Update Indexs,然后打開左側管理菜單 Administration > Scheduled Tasks,即可在計划任務列表中看到剛才建立的“update indexs”任務,這需要一定時間。
- 索引下載完成后,我們即可在倉庫的 Browse Index 中查看索引,並可進行相應的搜索
小提示:
- 其它倉庫配置可以參照上述過程。
- 可以通過Nexus OSS左側菜單 Administration > Logging 查看相應的日志。
- 關於Nexus OSS的其他管理功能不再累述,只需點擊左側菜單按提示操作即可
Maven與Nexus OSS的配合使用
修改Maven配置,加入私庫
$ vim ~/.m2/settings.xml # servers 內增加我們的私庫用戶 <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server> # mirrors增加私庫 <mirror> <id>nexus</id> <name>Local nexus repo</name> <url>http://nexus.aeonluck.me/nexus/content/groups/public/</url> <mirrorOf>*</mirrorOf> </mirror>
特別要注意的是:
一定要配置為 <mirrorOf>*</mirrorOf>
,即讓所有的倉庫都先經過私庫,這樣可以將遠程下載的包緩存到本地
小提示:
- Maven安裝目錄下的 /conf/settings.xml 起全局控制作用。
- 用戶目下的Maven配置文件,即:~/.m2/settings.xml 僅對當前用戶用效
添加個國內倉庫 默認的apache的倉庫下載速度比較慢,這里選擇阿里雲的Nexus倉庫
$ vim ~/.m2/setting2.xml # 在mirrors中增加以下內容 # 注意,位置於我們的私庫之后,否則私服不能緩存到下載的包。 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
關於Maven的mirror:
- mirrors可以配置多個mirror,每個mirror有id,name,url,mirrorOf屬性,id是唯一標識一個mirror就不多說了,name貌似沒多大用,相當於描述,url是官方的庫地址,mirrorOf代表了一個鏡像的替代位置,例如central就表示代替官方的中央庫。
- 鏡像庫並不是一個分庫的概念,就是說當a.jar在第一個mirror中不存在的時候,maven會去第二個mirror中查詢下載。但事實卻不是這樣,當第一個mirror中不存在a.jar的時候,並不會去第二個mirror中查找,甚至於,maven根本不會去其他的mirror地址查詢。
- maven的mirror是鏡像,而不是“分庫”,只有當前一個mirror無法連接的時候,才會去找后一個,類似於備份和容災。
- mirror也不是按settings.xml中寫的那樣的順序來查詢的。所謂的第一個並不一定是最上面的那個。當有id為B,A,C的順序的mirror在mirrors節點中,maven會根據字母排序來指定第一個,所以不管怎么排列,一定會找到A這個mirror來進行查找,當A無法連接,出現意外的情況下,才會去B查詢。
Maven工程發布與私庫
一般情況下,一個使用Maven的Java團隊,都會有自己的項目倉庫,當開發完成相應的功能之后,都會發布相應的jar/war包到私服。供其它項目成員使用
發布配置 在Maven工程的pom.xml中增加以下內容
<!-- 工程自述 --> <groupId>org.aeonluck</groupId> <artifactId>org.aeonluck.hello</artifactId> <packaging>jar</packaging> <version>0.1.0-SNAPSHOT</version> <!-- 發布配置 --> <distributionManagement> <repository> <id>snapshots</id> <name>Snapshots</name> <url>http://nexus.local.me/nexus/content/repositories/snapshots/</url> </repository> </distributionManagement>
重要提示:
- 當發布到屬性為
snapshot
的倉庫時,工程自述說明小節中的<version>
,需要帶上后綴SNAPSHOT
,否則會當成release
發布。會收到400 Bad Request
錯誤。 - 發布配置中的
<url>
地址一定要區分清楚。並在release
與snapshot
倉庫里配置不同的地址。此外,id、name 要與Nexus中倉庫的配置 configuration 中的內容一致。 - Nexus OSS的倉庫屬性:
- snapshot : 快照版本,即不穩定的頻繁發布場所,常用於團隊成員快速聯調。
- release : 正式版本,即穩定包所在場所
發布jar到的私庫
$ cd /path/to/myproject $ mvn deploy
包發布之后,我們即可在Nexus OSS的管理倉庫中看到我們剛才發布的包
小提示
$ mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面的version -Dpackaging=jar # 發布到本地倉庫 mvn install:install-file -DgroupId=com.bea.xml -DartifactId=jsr173-ri -Dversion=1.0 -Dpackaging=jar -Dfile=[path to file] # 發布到私服 mvn deploy:deploy-file -DgroupId=com.bea.xml -DartifactId=jsr173-ri -Dversion=1.0 -Dpackaging=jar -Dfile=[path to file] -Durl=[url] -DrepositoryId=[id]