1. 程式人生 > >如何使用maven優雅地管理專案版本號

如何使用maven優雅地管理專案版本號

作者:syonChao

使用maven管理專案版本號

背景

經過一年的開發時間,採用spring MVC的框架建立的maven專案從最初的設立到目前的多功能的開發,經歷了很多功能版本的迭代,但是之前一直忙於專案開發,並沒有詳細管理專案的分支以及tag,直到出現一個問題。
我們的專案於去年9月份上線生產環境,由於系統穩定執行,就一直沒有跟隨我們的專案升級,直到最近,生產環境有一個新的需求,不需要接入目前最新的專案版本(代價太大),只需要在之前程式碼的基礎上新加一個功能即可,但是本人作為專案程式碼負責人有點慌,因為不記得當時用的程式碼是具體哪一個版本,不好拉取程式碼修改,針對這種教訓,毅然決定管理好程式碼版本更迭。

前端展示或者介面查詢專案版本號

查詢以前的專案版本號,可以使用前端展示或者介面查詢的方式,作為一個記錄,原理是將專案的版本號寫在配置檔案(application.properties)中,java程式碼讀取即可,但是每次更新版本,總覺得這樣寫比較low,因為pom檔案中有專案的版本號,直接讀取pom檔案中的版本號不就可以了嘛。java能直接讀取pom檔案的內容嗎?答案是:不可以,但是我們可以換一個方式,在maven構建專案的時候將pom檔案中的版本號寫入到配置檔案中。
1. 在src\main\resources\application.properties放置如下內容

version
=${project.version}

2. 配置pom.xml

<build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
  </build>

3. maven構建專案

執行maven package,
檢視生成的配置檔案中的application.properties, version值已經變成了pom.xml中的version

新的問題

一個maven工程,如果只是一個單一的主專案,那麼只要手動修改一下pom.xml就可以了,耗不了多少時間。但是如果這個maven專案有很多的子模組專案,那麼一個個手動的去改就比較複雜了,如下圖:
這裡寫圖片描述

規範

1、同一專案中所有模組版本保持一致
2、子模組統一繼承父模組的版本
3、統一在頂層模組Pom的節中定義所有子模組的依賴版本號,子模組中新增依賴時不要新增版本號
4、開發測試階段使用SNAPSHOT
5、生產釋出使用RELEASE
6、新版本迭代只修改頂層POM中的版本
如下兩圖,圖一表示根目錄pom檔案,圖二表示web模組pom檔案,如果手動修改,則每次都需要修改父pom和各個子pom檔案中版本號,很是複雜。
這裡寫圖片描述
這裡寫圖片描述

解決方案

在子目錄中使用${project.version},但是這隻針對於依賴的jar包,對於模組版本號沒有作用。使用maven命令修改(很多文章說需要使用外掛versions-maven-plugin),但是本人測試不使用外掛也可以成功。
前提:maven安裝成功
執行命令:

mvn versions:set -DnewVersion=2.3-SNAPSHOP

2.3-SNAPSHOP表示新的版本號,然後可以檢視,各個模組已經更新了版本號。

附:versions-maven-plugin外掛的使用

在父pom檔案中新增

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <generateBackupPoms>false</generateBackupPoms>
            </configuration>
        </plugin>
    </plugins>
</build>

總結

在專案程式碼中將版本號確定後,釋出到環境,然後將該版本打tag,以後如果發現環境有bug(或者新增新功能),先查詢該環境對應的專案版本號,然後根據該版本新建release分支,修改即可。