Maven dependency exclude的bug

最近碰到的一个bug。

maven的依赖传递,可以过滤掉特定的依赖。
但有时我希望能过滤掉所有的依赖,比如引用haodop-common的时候,只要hadoop-common的jar包,hadoop-common引入的其他依赖全部过滤。

maven2里不支持这种功能。maven 3.0.x/3.1.x里可以这么写,一个小trick:

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
<exclusions>
<exclusion>
<artifactId>*</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>

但是构建时会有warning:

1
2
3
4
5
6
7
8
9
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.netease.hadoop:meta-data:jar:0.1.0-SNAPSHOT
[WARNING] 'dependencies.dependency.exclusions.exclusion.groupId' for org.apache.hadoop:hadoop-common:jar with value '*' does not match a valid id pattern. @ line 62, column 30
[WARNING] 'dependencies.dependency.exclusions.exclusion.artifactId' for org.apache.hadoop:hadoop-common:jar with value '*' does not match a valid id pattern. @ line 61, column 33
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

在maven 3.2.1里,这成为一个正式的功能了,见Release Notes。其实就是把warning去掉了。。。

但是用mvn dependency:tree时还是有warning,而且输出的树结构里,hadoop-common引入的依赖还在,exclude元素根本没生效,这是maven-dependency-plugin的bug。2.1版本有warning,2.8版本就正常了。其他版本没试过。

maven-assembly-plugin也有bug,本该被排除的依赖还是会被打包,试了最新的2.5.4版本也是有问题。
我的写法:

1
2
3
4
5
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>

还不知道要怎么处理,只能自己手动在dependencySet里过滤了。

我只想说,隐性的bug真tm多。。。而且debug非常烦。折腾了2天。