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