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