在Maven2中,为了排除单个传递依赖,我必须这样做:
<dependency>
<groupId>sample.group</groupId>
<artifactId>sample-artifactB</artifactId>
<version>1</version>
<exclusions>
<exclusion>
<groupId>sample.group</groupId>
<artifactId>sample-artifactAB</artifactId>
</exclusion>
</exclusions>
</dependency>
这种方法的问题在于,我必须对sample-artifactB提供的每个传递依赖项都这样做。
是否有一种方法可以使用某种通配符一次性排除所有传递依赖项,而不是逐个排除?
我发现有一件事很有用:
如果您将带有排除项的依赖项放在项目的父POM的dependencyManagement部分中,或者放在可导入的依赖项管理POM中,那么您就不需要重复排除项(或版本)。
例如,如果你的父POM有:
<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
....
</dependencies>
</dependencyManagement>
然后,项目中的模块可以简单地将依赖声明为:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
父POM中的将指定版本和排除项。我几乎在我们所有的项目中都使用了这个技巧,它消除了很多重复。
对我有用的(可能是Maven的一个新特性)只是在排除元素中使用通配符。
我有一个多模块项目,其中包含一个在两个war打包模块中引用的“app”模块。其中一个war打包的模块实际上只需要域类(我还没有将它们从app模块中分离出来)。我发现这个方法很有效:
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>app</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
groupId和artifactId上的通配符排除了通常会通过使用该依赖项传播到模块的所有依赖项。
三年前我建议使用版本99 Does Not Exist,但现在我找到了一个更好的方法,特别是因为版本99是离线的:
在项目的父POM中,如果不需要的依赖项渗透到构建中,使用maven-enforcer-plugin使构建失败。这可以使用插件的禁用依赖规则来完成:
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0.1</version>
<executions>
<execution>
<id>only-junit-dep-is-used</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<bannedDependencies>
<excludes>
<exclude>junit:junit</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
然后,当它提醒你一个不需要的依赖项时,将它排除在父POM的<dependencyManagement>节中:
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<version>2.1.8.RELEASE</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
这样,不需要的依赖关系就不会意外出现(不像<exclusion>那样容易被忘记),它甚至在编译时也不可用(不像所提供的作用域),没有虚假的依赖关系(不像版本99),它可以在没有自定义存储库的情况下工作(不像版本99)。这种方法甚至可以基于工件的版本、分类器、范围或整个groupId工作——详情请参阅文档。