【Maven官网文档】Optional & Exclusion Maven中的可选依赖和依赖性排除

本节介绍Maven中的可选依赖和依赖性排除功能。
【原文链接】

Optional 依赖

如果明确一个 project 无论出于什么原因考虑都不可能继续分割成子项目,则其依赖可以使用 optional。
如果其他 project 依赖了 使用 optional 的 project, 则他们需要自主选择该依赖,亦即是说,该 optional 依赖不会通过传递性依赖传递给上层的 project。

为什么要使用 optional 依赖?

如果是为了节省内存空间大可不必如此选择optional依赖。原因是,使用一个 project,控制其依赖list是很重要的,因为这些依赖最后可能都会打包成 war、jar 等等,可能会违反许可协议或者引起类路径问题。

如何使用 optional 依赖?

在你的 dependency 中将属性 设置为true即可。projectA的依赖如下:

<project>
  ...
  <dependencies>
    
    <dependency>
      <groupId>sample.ProjectBgroupId>
      <artifactId>Project-BartifactId>
      <version>1.0version>
      <scope>compilescope>
      <optional>trueoptional> 
    dependency>
  dependencies>
project>

optional 是怎么工作的?

Project-A -> Project-B

上面的这幅图表示了,projetA依赖于projectB, 且 projectB的设置为依赖可选项为true。

Project-X -> Project-A

假如现在有另一个peojectX依赖于projectA 时,optional 设置就生效了,你会发现 projectX 并没有依赖于 projectB,你必须直接在 projectX 的pom中依赖 projectB。
也就是在以下的依赖链中:

Project-X -> Project-A -> Project-B

Project-B 失去了传递依赖性。

Exclusions 依赖

Maven 是解决依赖关系的,在你的项目类路径中可能包含不必要的依赖。例如,你所依赖的项目可能并没有正确的声明他们的依赖。为了解决这个情况,maven 2.x 包含了显示排除依赖的概念exclusion。 Exclusions 用于排除在你的pom中的某个指定的依赖,当你build你的project时,这个依赖不会打包到你的类路径下。

如何使用 exclusion依赖?

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectAgroupId>
      <artifactId>Project-AartifactId>
      <version>1.0version>
      <scope>compilescope>
      <exclusions>
        <exclusion>  
          <groupId>sample.ProjectBgroupId>
          <artifactId>Project-BartifactId>
        exclusion>
      exclusions> 
    dependency>
  dependencies>
project>

ProjectX 依赖于 ProjectA, ProjectA 依赖于ProjectB,在 ProjectX 的pom中将ProjectA的dependency中添加ProjectB的排除依赖。这样ProjectB就不会在构建的时候打包到ProjectX的类路径中的。

要完成此功能一样的效果,你也可以在ProjectA中将ProjectB的optional设置为true。

Optional 和 Exclusions 依赖的总结

  • Optional 是保证依赖向上不扩散
  • Exclusions 是排除依赖的子(孙…)依赖关系

你可能感兴趣的:(【Maven】)