一、簡介
Maven是一個采用純Java編寫的開源項目管理工具, Maven采用了一種被稱之為Project Object Model(POM)概念來管理項目,所有的項目配置信息都被定義在一個叫做POM.xml的文件中, 通過該文件Maven可以管理項目的整個生命周期,包括清除、編譯,測試,報告、打包、部署等等。目前Apache下絕大多數項目都已經采用Maven進行管理. 而Maven本身還支持多種插件, 可以方便更靈活的控制項目, 開發人員的主要任務應該是關注商業邏輯並去實現它, 而不是把時間浪費在學習如何在不同的環境中去依賴jar包,項目部署等。
maven和ant都是軟件構建工具(軟件管理工具),maven比ant更加強大,已經取代了ant,jar包的聲明式依賴描述。maven有jar包的倉庫。svn是一個軟件的版本控制工具,是一個協同開發工具。svn的倉庫存放的是項目的源碼,歷史版本的備份,聲明每次版本的修改情況。
私服是架設在局域網的一種特殊的遠程倉庫,目的是代理遠程倉庫及部署第三方構件。有了私服之后,當 Maven 需要下載構件時,直接請求私服,私服上存在則下載到本地倉庫;否則,私服請求外部的遠程倉庫,將構件下載到私服,再提供給本地倉庫下載。
來到新公司發現maven私服都沒有,還在用手動打jar包的方式添加依賴,所以不得不研究這個了。
二、搭建maven
1.下載maven壓縮包 apache-maven-3.5.4-bin.tar.gz ,然后解壓 tar -zxf apache-maven-3.5.4-bin.tar.gz
2.添加環境變量
vi /etc/profile
在文件下方添加如下內容(這里的MAVEN_HOME需要改為你自己的maven解壓目錄):
export JAVA_HOME="/opt/jdk1.8" export MAVEN_HOME="/opt/apache-maven-3.5.4" export PATH="$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH"
然后保存退出。
3.輸入命令 mvn version 看到如下內容說明安裝成功了。
三、部署nexus
3.1.下載
由於專業版的nexus是收費的,所以我下載的是開源版 Nexus OSS,下載地址為 https://www.sonatype.com/download-oss-sonatype
點擊紅框區域即可下載得到文件nexus-3.13.0-01-unix.tar.gz,然后上傳到服務器目錄下,我的是/opt目錄。
3.2.解壓
cd /opt
tar -zxf nexus-3.13.0-01-unix.tar.gz
解壓后會多出兩個目錄,nexus-3.13.0-01和sonatype-work。
雖然不知道后面一個目錄是干嘛的,不管它就行了。
3.3.啟動
1 cd nexus-3.13.0-01/bin/
2 ./nexus start
看到如圖所示內容表明我們已經啟動成功了,游覽器輸入http://localhost:8081即可訪問。
注意:
1.Nexus3開始訪問URL已經變了,以前是http://localhost:8081/nexus,這個坑了我好一會兒。
2.啟動后如果你立即訪問可能發現什么都沒有,不要急這個啟動需要一定時間,30秒后到1分鍾后再嘗試訪問,這個開始我以為出問題了。
點擊右上角的sign in登錄,輸入賬戶admin,密碼admin123即可登錄成功。
3.4倉庫介紹
按圖中標識順序點擊,就可以看到有這些倉庫,現在分別介紹它們,分為三種類型:
proxy:是遠程倉庫的代理。比如說在nexus中配置了一個central repository的proxy,當用戶向這個proxy請求一個artifact,這個proxy就會先在本地查找,如果找不到的話,就會從遠程倉庫下載,然后返回給用戶,相當於起到一個中轉的作用。
Hosted:是宿主倉庫,用戶可以把自己的一些構件,deploy到hosted中,也可以手工上傳構件到hosted里。比如說oracle的驅動程序,ojdbc6.jar,在central repository是獲取不到的,就需要手工上傳到hosted里,一般用來存放公司自己的jar包;
Group:是倉庫組,在maven里沒有這個概念,是nexus特有的。目的是將上述多個倉庫聚合,對用戶暴露統一的地址,這樣用戶就不需要在pom中配置多個地址,只要統一配置group的地址就可以了右邊那個Repository Path可以點擊進去,看到倉庫中artifact列表。不過要注意瀏覽器緩存,當你的項目希望在多個repository使用資源時就不需要多次引用了,只需要引用一個group即可。
maven-public:maven-central、maven-release和maven-snapshot三個庫的合集。
maven-release:用來存放release版本的jar包。
maven-snapshot:用來存放snapshot版本的jar包。
四、上傳jar包到maven私服
4.1添加倉庫認證
找到本地電腦的setting.xml(我的是C:\Users\2YSP\.m2\setting.xml),打開后找到servers節點,在里面添加如下內容。
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
4.2在項目的pom.xml添加遠程發布的私服倉庫地址
1 <distributionManagement>
2 <repository>
3 <!--此id要與setting.xml里面server的id對應-->
4 <id>releases</id>
5 <name>releases Repository</name>
6 <url>http://192.168.75.132:8081/repository/maven-releases/</url>
7 </repository>
8 <snapshotRepository>
9 <id>snapshots</id>
10 <name>snapshots</name>
11 <url>http://192.168.75.132:8081/repository/maven-snapshots/</url>
12 </snapshotRepository>
13 </distributionManagement>
這里的192.168.75.132是我虛擬機的IP地址,這里的URL可以點擊倉庫查看詳情獲取。
4.3發布
先點擊clean,在點擊deploy就會自動根據項目的版本上傳到對應的倉庫(如果pom.xml上版本是1.1-SNAPSHOT則會deploy到maven-snapshot,如果是1.1.RELEASE則會deploy到maven-release)。
一般打包時maven會自動執行單元測試很耗時間,如果想略過該過程可以在pom文件添加如下插件。
1 <!-- 打包跳過測試-->
2 <plugin>
3 <groupId>org.apache.maven.plugins</groupId>
4 <artifactId>maven-surefire-plugin</artifactId>
5 <version>2.18.1</version>
6 <configuration>
7 <skipTests>true</skipTests>
8 </configuration>
9 </plugin>
上傳結果如圖:
然后在maven倉庫里就可以找到我們剛剛上傳的jar包了。
注意:maven倉庫的Deployment policy一定要設置成allow redeploy,否則會上傳失敗。
五、從私服下載jar包
5.1添加倉庫地址
<repositories>
<repository>
<id>releases</id>
<name>maven-public</name>
<url>http://192.168.75.132:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
針對單個項目,這個可以添加到項目的pom.xml文件里,如果很多項目都需要可以添加到setting.xml文件中。
5.2添加依賴,以下為示例
<dependency>
<groupId>cn.sp</groupId>
<artifactId>kafka-spring-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
然后一刷新發現項目里就有了。
六、常見錯誤及解決辦法
問題一:上傳報錯誤碼405,Failed to transfer file。
解決方法:仔細查看報錯信息就會發現,是上傳的url錯了,反正原因就是repository的地址寫錯了。
問題二:錯誤碼401或者403
解決方法:其實403錯誤就是“禁止訪問”的含義,所以問題的根源肯定在授權上面。Maven在默認情況下會使用deployment帳號(默認密碼deploy)登錄的系統,但是關鍵的Nexus中Releases倉庫默認的Deployment Policy是“Disable Redeploy”,所以無法部署的問題在這個地方,方法是將其修改為“Allow Redeploy”就可以了。401就是Maven settings.xml沒有設置密碼。
具體參考地址:https://www.javatang.com/archives/2010/01/23/4518375.html