大多數java應用源碼構建和依賴管理是使用maven來實現的,咱們的應用系統也都是基於maven構建的,maven雖然在依賴管理方面確實很便捷,可是也發現也有"死角",它並不能很好地解決全部依賴的問題,「全局排除」功能。html
咱們的項目是基於rose框架的,是基於spring的版本是2.5.6.近期須要用到active-mq.須要把版本升級,因此須要用到3.1.1版本.因爲咱們的系統比較龐大,中間層服務的項目互相依賴,致使spring-2.5.6.SEC03.jar間接依賴比較多.java
maven會對重複依賴的jar包進行過濾,對傳遞依賴過濾的規則是:web
1.路徑最近者優先.spring
2.先聲明的優先.apache
mvn dependency:tree:查看項目構建的依賴樹.可是這個並不全,至關是刪減版的.框架
像要解決個人問題就必須加上-Dverbose參數,加上這個展現的就是所有的依賴樹了.eclipse
執行後,結果發現傻眼了,spring-2.5.6.SEC03.jar這個引入的地發有近30處,而後我就像有沒有全局排除呢,這樣聲明一處就行了.結果發現最新版的最新版仍是沒有,雖然對外說的是"後續會提供".....,當時心裏是崩潰的.只有所有加上exclusion了.求當時內心的陰影面積.....maven
而後想到總有一些jar包是不能"共處一室"的,不然會"同室操戈"的.好比slf4j-log4j和logback,guava和google-collection等等這種,對於web開發者來講,這些都是"屢見不鮮",這那該怎麼避免呢?ui
而後找了下,maven還算"有點良心",提供了好在maven提供了相應的插件,它就是maven-enforcer-plugin,裏面有一項功能bannedDependencies,能夠經過設置依賴黑白名單,若是有依賴匹配了黑名單中的依賴設置,那麼maven會中止(能夠配置)當前操做(打包構建,甚至是mvn eclipse:eclipse),打印錯誤日誌提示,配置的代碼以下:google
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <executions> <execution> <id>enforce-versions</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <requireMavenVersion> <version>2.1.0</version> </requireMavenVersion> <requireJavaVersion> <version>1.6</version> </requireJavaVersion> </rules> </configuration> </execution> <execution> <id>enforce-banned-dependencies</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <bannedDependencies> <excludes> <exclude>junit:junit</exclude> <exclude>org.testng:testng</exclude> <exclude>com.google.collections:google-collections</exclude> <exclude>commons-logging:commons-logging</exclude> </excludes> <includes> <include>junit:junit:3.8.1:jar:test</include> </includes> </bannedDependencies> </rules> <fail>true</fail> </configuration> </execution> </executions> </plugin>
從這個插件配置上能夠看出,還能夠限制java版本以及maven版本。重點看看對依賴黑白名單,黑名單中規定不能引入google-collections,那麼一旦依賴了這個,操做會提示,至因而不是會中止操做,取決於下邊fail標籤中的配置。比較特殊的是黑名單中排除了junit,而白名單中更加詳細地描述junit,這個能夠這麼解讀:不容許依賴junit,除了版本是3.8.1的scope爲test的junit,今後能夠看出,白名單是對黑名單的補充,這樣更加靈活。
雖然黑白名單能夠解決一部分問題,可是仍是由衷的但願儘早出現全局排除活躍jar包的問題.
貢獻:
1.http://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html
2.http://maven.apache.org/plugins/maven-dependency-plugin/usage.html
3.https://my.oschina.net/liuyongpo/blog/177301