Maven:如何排除或设置提供给由其他依赖项拖动的依赖项

时间:2019-08-20 06:29:03

标签: java maven

我在使用maven进行构建的大型Java项目中遇到问题。
我有很多主要应用程序正在使用的依赖项,例如(40)。

问题在于这些依赖项拖累了更多的依赖项
其中一些我不能也不想包含在我的最终版本中
这是依赖地狱!

如何在主应用程序pom中排除maven中的特定依赖项?
我不希望在我的应用程序最终部署中使用它。

例如,如果我在主pom中进行了设置,它并不会将spring-boot-starter-tomcat的所有依赖项从其他依赖项中拖到provider中,而只是顶层。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

2 个答案:

答案 0 :(得分:1)

Maven引入了库所需的所有依赖关系,并为运行时构建了依赖关系。大多数情况下,您会希望这种情况发生,因为您不想遍历依赖项的每个依赖项,然后再遍历它们的内部依赖项(这样做很麻烦,请不要这样做)。但是在某些情况下,您可能希望避免引入很少的内部依赖项,因为在项目级别具有相同的内部依赖项,对于这些情况,maven允许您用<exclusions>排除它们。

以下示例来自Maven官方文档:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>
</project>

要了解更深的知识,请here

希望这会有所帮助!

答案 1 :(得分:0)

如果您将依赖项设置为范围provided,则下面的所有传递性依赖项也将变为provided-除非<dependencyManagement>覆盖该依赖项的版本/作用域。看一下mvn dependency:tree来找出答案。

命令mvn dependency:list将准确列出Maven认为项目的依赖项。在最终的工件中,您可以将所有不需要的依赖项设置为provided,也可以找出它们包含在哪些工件下,并按照@vizsatiz的说明编写排除语句。