讀古今文學網 > Maven實戰 > 13.4 自動化版本發佈 >

13.4 自動化版本發佈

本章前幾節已經詳細介紹了版本發佈時所需要完成的工作,讀者如果願意,則完全可以手動地執行這些操作,檢查是否有未提交代碼、是否有快照依賴、更新快照版至發佈版、執行Maven構建以及為源代碼打標籤等。事實上,如果對這一過程不是很熟悉,那麼還是應該一步一步地操作一遍,以得到最直觀的感受。

當熟悉了版本發佈流程之後,就會希望借助工具將這一流程自動化。Maven Release Plugin就提供了這樣的功能,只要提供一些必要的信息,它就能幫我們完成上述所有版本發佈所涉及的操作。下面介紹如何使用Maven Release Plugin發佈項目版本。

Maven Release Plugin主要有三個目標,它們分別為:

·release:prepare準備版本發佈,依次執行下列操作:

■檢查項目是否有未提交的代碼。

■檢查項目是否有快照版本依賴。

■根據用戶的輸入將快照版本升級為發佈版。

■將POM中的SCM信息更新為標籤地址。

■基於修改後的POM執行Maven構建。

■提交POM變更。

■基於用戶輸入為代碼打標籤。

■將代碼從發佈版升級為新的快照版。

■提交POM變更。

·release:rollback回退release:prepare所執行的操作。將POM回退至release:prepare之前的狀態,並提交。需要注意的是,該步驟不會刪除release:prepare生成的標籤,因此用戶需要手動刪除。

·release:perform執行版本發佈。簽出release:prepare生成的標籤中的源代碼,並在此基礎上執行mvn deploy命令打包並部署構件至倉庫。

要為項目發佈版本,首先需要為其添加正確的版本控制系統信息,這是因為Maven Release Plugin需要知道版本控制系統的主幹、標籤等地址信息後才能執行相關的操作。一般配置項目的SCM信息如代碼清單13-1所示。

代碼清單13-1 為版本發佈配置SCM信息

代碼清單13-1中的connection元素表示一個只讀的scm地址,而developerConnection元素表示可寫的scm地址,url則表示可以在瀏覽器中訪問的scm地址。為了能讓Maven識別,connection和developerConnection必須以scm開頭,冒號之後的部分表示版本控制工具類型(這裡是svn),Maven還支持cvs、git等。接下來才是實際的scm地址,該例中的connection使用了http協議,而developerConnection則由於涉及寫操作,使用https協議進行了保護。

該配置只告訴Maven當前代碼的位置(主幹),而版本發佈還要涉及標籤操作。因此,還需要配置Maven Release Plugin告訴其標籤的基礎目錄,如代碼清單13-2所示。

代碼清單13-2 配置maven-release-plugin提供標籤基礎目錄

在執行release:prepare之前還有兩個注意點:第一,系統必須要提供svn命令行工具,Maven需要svn命令行工具執行相關操作,而無法使用圖形化的工具,如TortoiseSVN;第二,POM必須配置了可用的部署倉庫,因為release:perform會執行deploy操作將構件發佈到倉庫中。關於如何配置部署倉庫可參考9.6.1節。

一切就緒之後,在項目根目錄下運行如下命令:

Maven Release Plugin開始準備發佈版本,如果它檢測到項目有未提交的代碼,或者項目有快照版的依賴,則會提示出錯。如果一切都沒問題,則會提示用戶輸入想要發佈的版本號、標籤的名稱以及新的快照版本號。例如:

如果項目的artifactId為app,發佈前的版本為1.0.0-SNAPSHOT,則Maven Release Plugin會提示使用發佈版本號1.0.0,使用標籤名稱app-1.0.0,新的開發版本為1.0.1-SNAPSHOT。如果這些模式值正是你想要的,直接按Enter鍵即可,否則就輸入想要的值再按Enter鍵,如上例中為新的開發版本輸入了值1.1.0-SNAPSHOT。

基於這些信息,Maven Release Plugin會將版本從1.0.0-SNAPSHOT更新為1.0.0,並更新SCM地址http://192.168.1.103/app/trunk至http://192.168.1.103/app/tags/app-1.0.0。在此基礎上運行一次Maven構建以防止意外的錯誤出現,然後將這兩個變化提交,並為該版本打上標籤,標籤地址是http://192.168.1.103/app/tags/app-1.0.0。即tagBase路徑加上標籤名稱。之後,Maven Release Plugin會將POM中的版本信息從1.0.0升級到1.1.0-SNAPSHOT並提交。

至此,release:prepare的工作完成。如果這時你發現了一些問題,例如將標籤名稱配置錯了,則可以使用release:rollback命令回退發佈,Maven Release Plugin會將POM的配置回退到release:prepare之前的狀態。但需要注意的是,版本控制系統中的標籤並不會被刪除,也就是說,用戶需要手動執行版本控制系統命令刪除該標籤。

在多模塊項目中執行release:prepare的時候,默認maven-release-plugin會提示用戶設定每個模塊發佈版本號及新的開發版本號。例如,如果在account-parent模塊中配置正確的scm信息之後進行項目發佈,就會看到如下的輸出:

在很多情況下,我們會希望所有模塊的發佈版本以及新的SNAPSHOT開發版本都保持一致。為了避免重複確認,maven-release-plugin提供了autoVersionSubmodules參數。例如運行下面的命令後,maven-release-plugin就會自動為所有子模塊使用與父模塊一致的發佈版本和新的SNAPSHOT版本:

如果檢查下來release:prepare的結果沒有問題,標籤和新的開發版本都是正確的,可以執行如下發佈執行命令:

該命令將標籤中的代碼簽出,執行mvn deploy命令構建剛才準備的1.0.0版本,並部署到倉庫中。至此,版本1.0.0正式發佈完成。由於它已經被部署到了Maven倉庫中,其他人可以方便地配置對它的依賴。

細心的讀者可能會發現,如果你所發佈項目的打包類型為jar,在執行release:perform之後,不僅項目的主構件會被生成並發佈到倉庫中,基於該主構件的-sources.jar和-javadoc.jar也會生成並發佈。對於你的用戶來說,這無疑是非常方便的,他們不僅能夠下載你的主構件,還能夠得到項目的源碼和Javadoc。那麼,release:perform是怎樣生成-sources.jar和-javadoc.jar的呢?

8.5節介紹過,所有Maven項目的POM都繼承自超級POM,而如果打開超級POM,就能發現如代碼清單13-3所示內容。

代碼清單13-3 超級POM中sources和javadoc的配置

超級POM中定義了一個名為release-profile的Maven Profile,Profile是指一段在特定情況下被激活並更改Maven行為的配置,本書後續會有專門的章節詳細闡述。這裡看到activate元素下有一個名為performRelease、值為true的屬性配置,這表示當Maven運行時,如果運行環境中有performRelease屬性且值為true的時候,該Profile就被激活。也就是說,該Profile下的配置會得到應用。那麼,什麼情況下Maven運行環境中會有名為performRelease、值為true的屬性呢?可以在命令行指定。例如:

但是,讀者可能已經猜到了,在執行release:perform的時候,Maven Release Plugin會自動生成值為true的performRelease屬性。這時,超級POM中的release-profile就會被激活。

這個Profile配置了3個Maven插件,maven-sources-plugin的jar目標會為項目生成-source.jar文件,maven-javadoc-plugin的jar目標會為項目生成-javadoc.jar文件,而maven-deploy-plugin的update-release-info配置則會在部署的時候更新倉庫中的元數據,告訴倉庫該版本是最新的發佈版。每個插件配置中值為true的inherited元素則表示該插件配置可以被子POM繼承。

在日常的快照開發過程中,往往沒有必要每次都生成-source.jar和-javadoc.jar,但是當項目發佈的時候,這些文件就顯得十分重要。超級POM中的release-profile就是為了這種情形而設計的。需要注意的是,這種隱式的配置對於不熟悉Maven的用戶來說可能會顯得十分令人費解,因此將來的Maven版本中可能會從超級POM中移除這段配置,所以如果用戶希望在發佈版本時自動生成-sources.jar和-javadoc.jar,最好還是在自己的POM中顯式地配置這些插件。