pom.xml
中repositories標籤的做用是: 用來配置maven項目的遠程倉庫。示例以下:apache
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>遠程倉庫地址</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled> <!--snapshots默認是關閉的,須要開啓 -->
</snapshots>
</repository>
</repositories>
複製代碼
按照上面配置是實現了配置maven項目的遠程倉庫,可是,這樣的配置,若是咱們建立一個項目,就須要配置一次,很麻煩。能夠將上面的遠程倉庫配置在maven的setting.xml裏面.這樣就能夠實現只配置一次緩存
pom.xml
中pluginRepository
標籤的做用是: 用來配置maven插件的遠程倉庫。示例以下:bash
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Team Nexus Repository</name>
<url>遠程倉庫地址</url>
</pluginRepository>
</pluginRepositories>
複製代碼
依賴管理,經過在Pom中指定座標的形式將jar引入到項目中。那這個過程,要經歷怎樣一個流程呢?從哪裏尋找jar?下載的jar放到哪裏?服務器
將這個問題順下來,就知道nexus和maven的關係了。mybatis
從哪裏找到jar?項目用到的jar又存放在哪裏?這引出了倉庫的概念,maven經過倉庫來統一管理各類構件。Maven的倉庫分爲本地倉庫和遠程倉庫。併發
當Maven根據座標尋找構件時,它首先會查看本地倉庫,若是本地倉庫存在此構件,則直接使用;若是本地倉庫不存在此構件,或者須要查看是否有更新的構件版本,Maven會去遠程倉庫查找,發現須要的構件以後,下載到本地倉庫再使用。maven
到了這裏,問題的答案也就出來了。ui
首先,Nexus是一種遠程倉庫,根據上段的介紹,咱們已經知道遠程倉庫的做用。在遠程倉庫中,默認的是中央倉庫,中央倉庫是Maven核心自帶的遠程倉庫。那就使用中央倉庫不就得了嗎,爲何咱們要安裝Nexus呢?url
咱們從項目實際開發來看:spa
1.一些沒法從外部倉庫下載的構件,例如內部的項目還能部署到私服上,以便供其餘依賴項目使用。 2. 爲了節省帶寬和時間,在局域網內架設一個私有的倉庫服務器,用其代理全部外部的遠程倉庫。當本地Maven項目須要下載構件時,先去私服請求,若是私服沒有,則再去遠程倉庫請求,從遠程倉庫下載構件後,把構件緩存在私服上。這樣,及時暫時沒有Internet連接,因爲私服已經緩存了大量構件,整個項目仍是能夠正常使用的。同時,也下降了中央倉庫的負荷。 Nexus僅僅是私服的一種。
一、pom.xml文件添加distributionManagement節點
<!-- 使用分發管理將本項目打成jar包,直接上傳到指定服務器 -->
<distributionManagement>
<!--正式版本-->
<repository>
<!-- nexus服務器中用戶名:在settings.xml中<server>的id-->
<id>yang</id>
<!-- 這個名稱本身定義 -->
<name>Release repository</name>
<url>http://192.168.1.105:8081/repository/yang/</url>
</repository>
<!--快照
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Snapshots repository</name>
<url>http://192.168.1.105/repository/yang/</url>
</snapshotRepository>-->
</distributionManagement>
複製代碼
< repository >節點下的< id >對應setting.xml文件中的server的id
<!--maven鏈接nexus須要驗證用戶名和密碼-->
<server>
<id>yang</id>
<username>admin</username>
<password>admin123</password>
</server>
複製代碼
上傳正式版本,pom.xml文件version中不能有SNAPSHOT,快照版本纔有
<groupId>com.yang</groupId>
<artifactId>shade-plugin</artifactId>
<version>0.0.1</version>
<!-- <version>0.0.1-SNAPSHOT</version> -->
複製代碼
二、打包執行,上傳 在pom.xml文件中右擊,run As – Maven build … 打開以下的框。
在使用maven過程當中,咱們在開發階段常常性的會有不少公共庫處於不穩定狀態,隨時須要修改併發布,可能一天就要發佈一次,遇到bug時,甚至一天要發佈N次。咱們知道,maven的依賴管理是基於版本管理的,對於發佈狀態的artifact,若是版本號相同,即便咱們內部的鏡像服務器上的組件比本地新,maven也不會主動下載的。若是咱們在開發階段都是基於正式發佈版原本作依賴管理,那麼遇到這個問題,就須要升級組件的版本號,可這樣就明顯不符合要求和實際狀況了。可是,若是是基於快照版本,那麼問題就自熱而然的解決了,而maven已經爲咱們準備好了這一切。
maven中的倉庫分爲兩種,snapshot快照倉庫和release發佈倉庫。snapshot快照倉庫用於保存開發過程當中的不穩定版本,release正式倉庫則是用來保存穩定的發行版本。定義一個組件/模塊爲快照版本,只須要在pom文件中在該模塊的版本號後加上-SNAPSHOT便可(注意這裏必須是大寫),以下:
<groupId>cc.mzone</groupId>
<artifactId>m1</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>jar</packaging>
複製代碼
maven會根據模塊的版本號(pom文件中的version)中是否帶有-SNAPSHOT來判斷是快照版本仍是正式版本。若是是快照版本,那麼在mvn deploy時會自動發佈到快照版本庫中,而使用快照版本的模塊,在不更改版本號的狀況下,直接編譯打包時,maven會自動從鏡像服務器上下載最新的快照版本。若是是正式發佈版本,那麼在mvn deploy時會自動發佈到正式版本庫中,而使用正式版本的模塊,在不更改版本號的狀況下,編譯打包時若是本地已經存在該版本的模塊則不會主動去鏡像服務器上下載。
因此,咱們在開發階段,能夠將公用庫的版本設置爲快照版本,而被依賴組件則引用快照版本進行開發,在公用庫的快照版本更新後,咱們也不須要修改pom文件提示版本號來下載新的版本,直接mvn執行相關編譯、打包命令便可從新下載最新的快照庫了,從而也方便了咱們進行開發。
接下來要介紹的是如何在項目中應用snapshot和release庫,應用snapshot和release庫達到不一樣環境下發布不一樣的版本的目的,首先看一個pom文件的定義:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.aty.mybatis</groupId>
<artifactId>mybatis-demo</artifactId>
<packaging>jar</packaging>
<version>${project.release.version}</version>
<name>mybatis-demo</name>
<url>http://maven.apache.org</url>
<properties>
<project.release.version>0.1-SNAPSHOT</project.release.version>
</properties>
<profiles>
<profile>
<id>release</id>
<properties>
<project.release.version>0.1</project.release.version>
</properties>
</profile>
</profiles>
<!--定義snapshots庫和releases庫的nexus地址-->
<distributionManagement>
<repository>
<id>nexus-releases</id>
<url>
http://172.17.103.59:8081/nexus/content/repositories/releases/
</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<url>
http://172.17.103.59:8081/nexus/content/repositories/snapshots/
</url>
</snapshotRepository>
</distributionManagement>
</project>
複製代碼
首先咱們看到pom文件中version的定義是採用佔位符的形式,這樣的好處是能夠根據不一樣的profile來替換版本信息,好比maven默認是使用0.1-SNAPSHOT做爲該模塊的版本。
一、若是在發佈時使用mvn deploy -P release 的命令,那麼會自動使用0.1做爲發佈版本,那麼根據maven處理snapshot和release的規則,因爲版本號後不帶-SNAPSHOT故當成是正式發佈版本,會被髮布到release倉庫;
二、若是發佈時使用mvn deploy命令,那麼就會使用默認的版本號0.1-SNAPSHOT,此時maven會認爲是快照版本,會自動發佈到快照版本庫。
在distributionManagement段中配置的是snapshot快照庫和release發佈庫的地址,我這裏是採用nexus做爲鏡像服務器。對於版本庫主要是id和url的配置,配置完成後就能夠經過mvn deploy進行發佈了,固然了,若是你的鏡像服務器須要用戶名和密碼,那麼還須要在maven的settings.xml文件中作以下配置:
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
複製代碼
注意這裏配置的server的id必須和pom文件中的distributionManagement對應倉庫的id保持一致,maven在處理髮布時會根據id查找用戶名稱和密碼進行登陸和文件的上傳發布。
咱們這裏經過profile的定義就能夠在發佈靈活切換snapshot快照版本和release正式版本了,在被依賴的組件中也可使用profile來定義在開發階段使用快照庫,在發佈階段使用正式庫的功能,只須要在不一樣的profile中覆蓋默認的properties屬性值便可。