在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,或自定义pom在whaley的解决方案,需要维护;您只需要在容器中提供特定的依赖项就可以了

其他回答

我使用以下的解决方法:而不是试图在所有适当的依赖项中排除工件,我在顶层将依赖项绘制为“提供”。 例如,为了避免发布xml-api的“任何版本”:

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>

目前,没有办法一次排除一个以上的可传递依赖,但在Maven JIRA站点上有一个特性请求:

https://issues.apache.org/jira/browse/MNG-2315

在一个类似的问题中,我声明了所需的依赖项,并提供了作用域。 使用这种方法,可传递依赖项会被获取,但不会包含在包阶段,这正是您想要的。 我也喜欢这个解决方案在维护方面,因为没有pom,或自定义pom在whaley的解决方案,需要维护;您只需要在容器中提供特定的依赖项就可以了

三年前我建议使用版本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工作——详情请参阅文档。

有一个变通的办法,如果你将依赖项的作用域设置为运行时,传递依赖项将被排除在外。但是要注意,这意味着如果您想打包运行时依赖项,就需要添加额外的处理。

要在任何打包中包含运行时依赖项,您可以使用maven-dependency-plugin针对特定工件的复制目标。