1. 程式人生 > >pom配置之:snapshot快照庫和release釋出庫

pom配置之:snapshot快照庫和release釋出庫

本文轉載自:  鐵木箱子的mzone的部落格:

http://www.mzone.cc/article/277.html

http://www.mzone.cc/article/279.html

        在使用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作為該模組的版本。

1、如果在釋出時使用mvn deploy -P release 的命令,那麼會自動使用0.1作為釋出版本,那麼根據maven處理snapshot和release的規則,由於版本號後不帶-SNAPSHOT故當成是正式釋出版本,會被髮布到release倉庫;

2、如果釋出時使用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屬性值即可。