您现在的位置是:首页 >学无止境 >maven 可选依赖项 optional网站首页学无止境
maven 可选依赖项 optional
可选依赖项
当无法将项目拆分为子模块时,将使用可选依赖项。
某些依赖项仅用于项目中的某些功能,如果不使用该功能,则不需要。
理想情况下,此类功能将拆分为依赖于核心功能项目的子模块。
这个新的子项目将只有非可选的依赖项,因为如果您决定使用子项目的功能,则需要所有这些依赖项。
但是,由于无法拆分项目,这些依赖项被声明为可选依赖项。
如果用户想要使用与可选依赖项相关的功能,则必须在自己的项目中重新声明该可选依赖项。
这不是处理这种情况的最明确方法,但可选依赖项和依赖项排除都是权宜之计。
为什么使用可选依赖项
可选依赖项可节省空间和内存。它们可以防止违反许可协议或导致类路径问题的有问题的 jar 被捆绑到 WAR、EAR、fat jar 等中.
如何使用可选标签
通过在依赖项声明中将 <optional>
元素设置为 true,将依赖项声明为可选:
<!-- declare the dependency to be set as optional -->
<dependency>
<groupId>org.sample</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<scope>compile</scope>
<optional>true</optional> <!-- value will be true or false only -->
</dependency>
可选依赖项如何工作
Project-A -> Project-B
上图显示项目 A 依赖于项目 B(即在项目A的pom中有对项目B的依赖)。当 A 在其 POM 中将 B 声明为可选依赖项时,此关系保持不变(即有没有optional标签都不影响A对B的引用)。这就像一个普通的构建,其中项目 B 将被添加到项目 A 的类路径中。
Project-X -> Project-A
当另一个项目 (Project-X) 在其 POM 中将项目 A 声明为依赖项时,依赖项的可选性质
将生效。项目 B 不包含在项目 X 的类路径中。您需要直接在项目 X 的 POM 中声明项目 B,以便 B 包含在 X 的类路径中。
我的理解:可选依赖阻断了依赖传递
案例
假设有一个名为 X2 的项目具有与 Hibernate 类似的功能。它支持许多数据库,如MySQL,PostgreSQL和Oracle的几个版本。每个受支持的数据库都需要对驱动程序 jar 的额外依赖关系。在编译时需要所有这些依赖项来构建 X2。但是,您的项目仅使用一个特定数据库,不需要其他数据库的驱动程序。X2 可以将这些依赖项声明为可选依赖项,因此当项目在其 POM 中将 X2 声明为直接依赖项时,X2 支持的所有驱动程序都不会自动包含在项目的类路径中。您的项目必须包含对它使用的一个数据库的特定驱动程序的显式依赖关系。