本节介绍Maven中的可选依赖和依赖性排除功能。 【原文链接】
如果明确一个 project 无论出于什么原因考虑都不可能继续分割成子项目,则其依赖可以使用 optional。 如果其他 project 依赖了 使用 optional 的 project, 则他们需要自主选择该依赖,亦即是说,该 optional 依赖不会通过传递性依赖传递给上层的 project。
如果是为了节省内存空间大可不必如此选择optional依赖。原因是,使用一个 project,控制其依赖list是很重要的,因为这些依赖最后可能都会打包成 war、jar 等等,可能会违反许可协议或者引起类路径问题。
在你的 dependency 中将属性 <optional>设置为true即可。projectA的依赖如下:
<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>
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 失去了传递依赖性。
Maven 是解决依赖关系的,在你的项目类路径中可能包含不必要的依赖。例如,你所依赖的项目可能并没有正确的声明他们的依赖。为了解决这个情况,maven 2.x 包含了显示排除依赖的概念exclusion。 Exclusions 用于排除在你的pom中的某个指定的依赖,当你build你的project时,这个依赖不会打包到你的类路径下。
<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。