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

qin*_*shi 27 maven

当它们依赖于传递时,依赖关系被装饰<optional>true</optional><scope>provided</scope>将被忽略.我读过这个,我的理解就像Spring中的@Component和@Service之间的区别,它们只是在语义上有所不同.这样对吗?

JF *_*ier 31

除了注释之外,还有更重要的语义差异:"提供的"依赖项应该由容器提供,因此如果你的容器给你休眠,你应该将hibernate标记为提供的.

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

  1. 该库提供了大量的传递依赖关系,您实际上只需要很少的依赖关系,这样您就可以毫无理由地炸毁您的项目.

  2. 更危险的是:您可能会使用重叠的类来提取两个库,这样类加载器就无法加载它们.这可能会导致库的意外行为.

  • 只有当两个工件共享相同的groupId和artifactId时,您的注释才会成立.如果你有不同的groupId或不同的artifactId,但是同一个类,Maven就不会发现那个错误. (2认同)

Jak*_*ski 5

我想指出的一个小区别是对创建包的各种插件提供的可选和提供的处理。

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

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

阴影插件似乎也是如此。

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