咱們都知道,maven的出現使得咱們能夠很方便的管理項目依賴,並且能夠實現多模塊協做編譯、打包、運行。大多數狀況下,咱們一個maven項目都包含了多個子module,這個時候若是咱們想要把一個子module進行打包而且deploy到私服上供別人引用,那咱們須要:從父節點把整個project都deploy上去,這時別人才能拉到你上傳的jar包。同時咱們須要保證咱們整個project中全部的module的version都是一致的。git
問題引入maven
對於咱們來講,一般應用發展是很是快的,也就意味着咱們須要上線的週期很短,對於在測試時,咱們可使用-SNAPSHOT的方式,這樣每次上傳完,引用該依賴的項目發佈時,會自動再從私服上下載最新的版原本替換本地的jar包。可是線上咱們都是使用release版本發佈,因爲release版本的依賴在相同的版本號下,引用該依賴的項目在發佈時,不會再自動從私服上拉去最新的包來替換本地的包,因此就會出現問題。那就會有如下問題:測試
正式版不能重複發佈,因此每次上線版本號都須要更改插件
當項目中包含幾個子模塊時,一般咱們想讓子模塊的版本號跟父項目的版本號保持一致xml
子模塊間也會項目依賴it
最佳實踐io
上面的三個問題中,最容易解決的是第三個問題,咱們能夠在父項目的pom文件中的dependencyManagement中進行聲明依賴,子模塊直接使用,不須要指定版本號。編譯
優雅地修改多模塊maven項目中的版本號效率
子項目引用時,直接進行以下引用便可:module
優雅地修改多模塊maven項目中的版本號
雖然在子pom文件當中,咱們能夠不聲明groupId和version屬性,這樣就能夠實現全部子模塊的版本號都和父項目保持一致了。可是在子pom中的<parent></parent>標籤中的父項目的版本號仍是要寫的,否則編譯就會報錯,還不是很清楚是maven尚未進化到這麼智能化,仍是可能會形成其餘混亂從而必需要求指定。我原本想投機取巧的把這個父項目的版本號也用${project.version}來替換,但很惋惜沒能成功,install的時候報錯了,我想多是由於必需要先初始化<parent>標籤才能知道${project.version}是多少吧!
以往對於修改父項目的版本號,咱們很痛苦,每次都要把全部子模塊中的父項目的版本號都替換一下,又不敢批量替換,因此只能一個一個的改掉。那我就在尋求一種更加高效的方式,可使得我運行一個命令或者怎麼樣就能夠實現一次性把全部要改動的地方都改掉。念念不忘,必有迴響!一個偶然的機會我還真發現了一個神器,它就是versions-maven-plugin,在項目中引入該插件之後,就能夠一行命令實現修改父項目的版本號,而且子模塊中的父項目版本號的聲明也會一併被改掉,具體操做以下:
首先在父項目的pom.xml文件中,引用以下插件:
優雅地修改多模塊maven項目中的版本號
其中generateBackupPoms參數是設置是否修改版本時對現有版本的文件進行備份。由於咱們的項目通常都是交給git管理的,因此不須要讓該插件幫咱們備份,改錯了,直接revert就行了。
而後,你只須要在父pom.xml文件所在的文件夾下打開控制檯,運行:mvn versions:set -DnewVersion=xxx,這樣咱們就能夠實現把父項目的版本修改成xxx了。是否是很方便?尤爲當咱們的項目有幾十個子模塊的時候,這就給咱們帶來很大的效率提高了。否則升級幾回版本號,一天就過去了。