【问题标题】:Maven dependency scopes - RevisitedMaven 依赖范围 - 重温
【发布时间】:2017-09-23 03:00:46
【问题描述】:

请问有人知道官方 maven 文档中关于“范围矩阵”的以下相当明显的问题的答案:

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

脚注解释了为什么索引为 [compile,compile] 的单元格再次包含值“compile”。

在我看来,VERY SAME ARGUMENT 意味着以下内容:

  1. 单元格 [compile,provided] 和 [provided,provided] 都应包含“provided”。

  2. 单元格 [test,provided] 应包含“test”。

那么为什么所有这些单元格都包含“-”?!? 这对我来说没有意义......

非常感谢您提供各种有用的建议!

【问题讨论】:

    标签: maven


    【解决方案1】:

    provided表示依赖是由容器提供的,这意味着这个范围的使用取决于手头的容器。

    因此,这个范围应该设置在“可部署单元”(war、ear、standalone jar)的级别,而不是在传递依赖树的深处。 因此,对于 provided 依赖项具有传递性是没有用的。

    相反,您可以在*别使用dependencyManagement 覆盖范围,以确保您将容器提供的那些依赖项标记为已提供。

    【讨论】:

    • 谢谢,但我不相信,对不起:考虑以下情况:1.“Container-Artefact”B依赖于“Container-Artefact”C(范围“提供”,为什么不...... .) 2.“My-Artefact”A 依赖于“Container-Artefact”B(当然提供了范围......) 3. A 包含扩展 B 中的 Y 类的 X 类。 4. Y 扩展了 B 中的 Z 类C. 5. X 调用 Z 中定义的受保护方法 Z.m 现在编译器需要定义这个类 Z 以检查 Z.m 的签名,例如。但是由于[provided,provided]-单元格中的“-”,导致Z类不在手边,会出现错误。
    • 我会这样看:B 是“库”并且应该用作依赖项 - 然后它不应该提供依赖项,因为库可以在不同的容器中使用(或没有任何容器) )。或者 B 是一个可部署的单元,就像一个战争、耳朵、可执行的罐子。然后它应该定义必要的提供的依赖项,但是没有人(包括你的人工制品 A)应该将它用作依赖项。