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

2023-05-05 18:58:30 浏览数 (2)

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

Optional 依赖

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

为什么要使用 optional 依赖?

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

如何使用 optional 依赖?

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

代码语言:javascript复制
<project>
  ...
  <dependencies>
    <!-- 声明设置为optional的依赖项 -->
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <optional>true</optional> <!-- 仅仅支持true、false -->
    </dependency>
  </dependencies>
</project>

optional 是怎么工作的?

代码语言:javascript复制
Project-A -> Project-B

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

代码语言:javascript复制
Project-X -> Project-A

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

代码语言:javascript复制
Project-X -> Project-A -> Project-B

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

Exclusions 依赖

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

如何使用 exclusion依赖?

代码语言:javascript复制
<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- 声明排除依赖 -->
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>
</project>

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

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

Optional 和 Exclusions 依赖的总结

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

0 人点赞