何时使用<optional> true </optional>以及何时使用<scope>提供的</scope>

时间:2016-11-03 02:53:07

标签: maven

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

2 个答案:

答案 0 :(得分:21)

除了注释之外,还有更重要的语义区别:“提供的”依赖项应该由容器提供,所以如果你的容器给你休眠,你应该将hibernate标记为提供的。

可选依赖项主要用于减少某些库的传递负担。例如:如果您可以使用具有5种不同数据库类型的库,但通常只需要一个,则可以将依赖于库的依赖项标记为可选,以便用户可以提供实际使用的依赖项。如果不这样做,可能会遇到两类问题:

  1. 图书馆吸引了大量的传递依赖关系,实际上你需要这些依赖关系很少,这样你就会毫无理由地炸毁你的项目。

  2. 更危险:您可能会使用重叠类拉出两个库,因此类加载器无法加载它们。这可能会导致库的意外行为。

答案 1 :(得分:2)

我要指出的一个小区别是处理创建软件包的各种插件提供的可选与否。

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

assembly插件似乎没有提供任何根据可选状态进行过滤的方法,而允许您根据范围进行过滤。

shade插件似乎也是如此。

TL; DR(如果您不是在开发库,而是使用顶级应用程序提供的范围将为您提供更大的灵活性。