maven 全局排除jar包

原创
2016/12/04 17:03
阅读数 1.3W

大多数java应用源码构建和依赖管理是使用maven来实现的,我们的应用系统也都是基于maven构建的,maven虽然在依赖管理方面确实很便捷,但是也发现也有"死角",它并不能很好地解决所有依赖的问题,“全局排除”功能。

  我们的项目是基于rose框架的,是基于spring的版本是2.5.6.近期需要用到active-mq.需要把版本升级,所以需要用到3.1.1版本.由于我们的系统比较庞大,中间层服务的项目互相依赖,导致spring-2.5.6.SEC03.jar间接依赖比较多.

   maven会对重复依赖的jar包进行过滤,对传递依赖过滤的规则是:

   1.路径最近者优先.

   2.先声明的优先.

   mvn dependency:tree:查看项目构建的依赖树.但是这个并不全,相当是删减版的.

   像要解决我的问题就必须加上-Dverbose参数,加上这个展示的就是全部的依赖树了.

   执行后,结果发现傻眼了,spring-2.5.6.SEC03.jar这个引入的地发有近30处,然后我就像有没有全局排除呢,这样声明一处就好了.结果发现最新版的最新版还是没有,虽然对外说的是"后续会提供".....,当时内心是崩溃的.只有全部加上exclusion了.求当时心里的阴影面积.....

   然后想到总有一些jar包是不能"共处一室"的,否则会"同室操戈"的.比如slf4j-log4j和logback,guava和google-collection等等这种,对于web开发者来说,这些都是"家常便饭",这那该怎么避免呢?

   然后找了下,maven还算"有点良心",提供了好在maven提供了相应的插件,它就是maven-enforcer-plugin,里面有一项功能bannedDependencies,可以通过设置依赖黑白名单,如果有依赖匹配了黑名单中的依赖设置,那么maven会停止(可以配置)当前操作(打包构建,甚至是mvn eclipse:eclipse),打印错误日志提示,配置的代码如下:

<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

展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
打赏
1 评论
1 收藏
1
分享
返回顶部
顶部