我們現在通用的maven項目結構可能是這樣的:
*parent module*
*module A*
*module B*
大家遇到過以下幾個問題沒?
1.maven多個模塊之間互相依賴,一個模塊更新影響另一個模塊的運行;
2.maven 不小心把開發版jar包deploy到遠程倉庫,影響到了線上的正式環境;
3.團隊有人更新了SNAPSHOT版本,你rebuild之后無法運行;
一個父模塊下有幾個子模塊,父模塊包含所有子模塊的公共依賴,比如使用的日志系統;指定公共的模塊版本,比如數據庫驅動版本等等。
同時子模塊都繼承父模塊,就有個很常見的問題產生,如果父模塊的版本更新了,需要手動一個一個子模塊修改繼承的父模塊的版本號,例如下面的例子:
<!--父模塊版本信息-->
<version>1.1.0-SNAPSHOT</version>
<modules> <module>pulldata-contract</module> <module>pulldata-common-service</module> <module>pulldata-notifyservice</module> <!--<!–<module>pulldata-pullservice</module>–>--> <module>pulldata-dataproviders</module> <module>pulldata-webservice</module> <module>pulldata-mqservice</module> <module>hbxj-dataproviders</module> </modules>
一個父模塊下有7個子模塊,如果父模塊的version從1.1.0-SNAPSHOT更新到了1.1.1-SNAPSHOT,每一個子模塊都需要一個個更新,其實說這么多就是為了引出maven的版本管理插件 Versions,
verisons提供了很多好用的功能,我們看下怎么解決剛才說的問題:
1,先安裝,很簡單,在父pom文件中加入如下代碼:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>2.7</version> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>2.7</version> </plugin> </plugins> </build>
2. 比如上面這個問題,我們可以直接運行一條maven指令:
mvn -N versions:update-child-modules //更新所有的子模塊繼承的父模塊版本號
就可以把所有繼承的子模塊更新為和父模塊一致了。
3.還有很多好用的功能,
3.1我們開發的版本一般用SNAPSHOT版本,線上版本用RELEASE版本,一般SNAPSHOT 沒有自定義或手動deploy的話,deploy的頻率是一天一次。
為了防止你項目中依賴的SNAPSHOT版本的代碼因為團隊其他同事的deploy操作而變得不可用,可以先用
mvn versions:lock-snapshots
鎖住當前項目中的snapshot依賴包,開發完成之后再用
mvn versions:unlock-snapshots
解鎖。
3.2 下面這個命令很有用,可以設置整個項目的版本號,在你需要設置新版本號,可以全局更新項目版本號。一般開發環境就設置成SNAPHSHOT版本,測試測完之后沒問題設置成Release版。
mvn versions:set -DnewVersion=1.0.1-SNAPSHOT //更新整個項目版本
3.3 其他命令參考文檔
versions:set versions:lock-snapshots versions:resolve-ranges versions:unlock-snapshots versions:update-child-modules versions:update-parent versions:update-properties versions:set-property versions:use-latest-releases versions:use-latest-snapshots versions:use-latest-versions versions:use-next-releases versions:use-next-snapshots versions:use-next-versions versions:use-releases
我一般主要用到的幾個還是上面提到的。
另外附一些我常用mvn指令
mvn clean package -pl 要編譯module目錄 -am -Pdev -DskipTests // -pl 只編譯指定module 節省時間 -am 指定module依賴的模塊也編譯
mvn clean install //安裝jar包到本地倉庫
mvn deploy //deploy jar包到遠程倉庫
參考 https://danielflower.github.io/2015/03/08/The-Multi-Module-Maven-Release-Plugin-for-Git.html