Maven提供了Maven-Enforcer-Plugin插件,用來校驗約定遵守情況(或者說校驗開發環境)。比如JDK的版本,Maven的版本,開發環境(Linux,Windows等),依賴jar包的版本等等
看有些文章說,這個插件檢查的是maven最終使用的版本情況,我不認同,因為這個插件有個設置是:是否檢查傳遞依賴
如果不設置,就有可能失去對屬於間接依賴的插件的檢查(假如這個依賴插件只出現在間接依賴里)如果設置了,就會檢查傳遞性依賴,如果傳遞性依賴不滿足條件也會導致項目編譯失敗,這是不合理的,因為maven最終發布的項目jar包里,有可能並包含這個依賴(在處理沖突時去掉:路徑最短原則;第一聲明原則)
另外:這個插件無法處理像 [INFO] | \- org.springframework:spring-expression:jar:3.2.4.RELEASE:compile 這種后面還帶“RELEASE”信息的
我們再來看下mvn的dependency插件的功能:
mvn dependency:tree -Dverbose 可以顯示哪些版本因為沖突而被忽略
mvn dependency:copy-dependencies -DoutputDirectory=$WORKSPACE/dependencies可以把項目的所有依賴copy到一個指定的目錄,通過這個目錄,你可以看到項目的所有依賴信息。
你在根目錄(父pom文件位置)執行這條命令,就能看到項目的所有依賴(包括傳遞性依賴);你在子模塊(子pom.xml文件所在目錄)目錄執行這個命令,就能看到子模塊的所有依賴(包括傳遞性依賴),而且是從上圖的信息里可以看到,各個模塊沖突的依賴已經被忽略。
但是它存在的問題是,如果多個子模塊含有一個依賴的多個版本,該如何處理?最終的項目打包會使用哪一個版本呢?
mvn install/mvn deploy 本地安裝或者遠程部署里,只能存在一個版本的依賴
內嵌的規則:
http://maven.apache.org/enforcer/enforcer-rules/index.html
自定義規則:
http://maven.apache.org/enforcer/enforcer-api/writing-a-custom-rule.html
參考:
1、http://www.cnblogs.com/qyf404/p/4829327.html
2、http://blog.csdn.net/wangjunjun2008/article/details/11599307
3、http://zhwj184.iteye.com/blog/1528627
4、https://oolap.com/2015-10-22-use-maven-enforcer-plugin-check-deps
5、官網:http://maven.apache.org/enforcer/maven-enforcer-plugin/