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

相关文章
相关标签/搜索