何时使用“可选”依赖项,何时使用“提供”作用域?

<optional>true</optional><scope>provided</scope>修饰的依赖项在传递依赖时将被忽略。我读过 这个,我的理解就像在 Spring 中@Component 和@Service 的区别一样,它们只是在语义上有所不同。

对吗?

28671 次浏览

除了注释之外,还有更重要的 语义上的差异: “提供”的依赖项应该由容器提供,所以如果您的容器提供了 hibernate,那么您应该按照提供的标记 hibernate。

可选依赖关系主要用于减轻一些库的传递负担。例如: 如果您可以使用具有5种不同数据库类型的库,但通常只需要一种,那么您可以将依赖于库的依赖性标记为可选的,这样用户就可以提供他们实际使用的依赖性。如果你不这样做,你可能会遇到两种类型的问题:

  1. 这个库提供了大量的传递依赖关系,实际上您只需要很少的这些依赖关系,因此您会毫无理由地破坏您的项目。

  2. 更危险的是: 您可能会提取两个具有重叠类的库,因此类装入器无法同时装入这两个库。这可能会导致库出现意想不到的行为。

我想指出的一个小区别是,创建软件包的各种插件所提供的可选与不可选的处理方式。

显然 war 插件不会打包可选的依赖项,但是有一个关于它的开放 bug: https://issues.apache.org/jira/browse/MWAR-351

汇编插件似乎没有提供任何基于可选状态的过滤方法,但它允许您基于范围进行过滤。

阴影插件似乎也是如此。

如果您不是在开发一个库,而是一个顶级应用程序提供的作用域,那么 TL; DR 将提供更大的灵活性。