maven 全局排除jar包

大多數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

相關文章
相關標籤/搜索