【问题标题】:Maven : what is the "runtime" scope purpose? [duplicate]Maven:“运行时”范围的目的是什么? [复制]
【发布时间】:2012-08-29 15:29:13
【问题描述】:

可能重复:
Understanding Compile- vs Run-time Dependencies

我了解具有“运行时”范围的依赖项将在运行时而不是在编译时可用。但我不明白你为什么想要那个!为什么不简单地使用“编译”范围呢?

docs 并没有真正的帮助。有什么想法吗?

【问题讨论】:

  • 谢谢韦斯,这个问题确实很相关。可惜我还是不明白!我会为 servlet-api 之类的依赖项使用“提供”,而不是“运行时”。如果可能的话,我希望看到一个真实的例子,其中使用“运行时”比“编译”和“提供”更好!
  • John Stauffer 的回答提到的 JDBC Driver 就是一个很好的例子。另一个例子可以是 SLF4J。您只需要 slf4j-api 进行编译,并且应该避免将 slf4j-log4j12(或其他类型的绑定)作为编译范围依赖项。 slf4j-log4j12 是运行时依赖的良好候选者。
  • 为什么?是因为 slf4j-log4j12 应该在应用服务器的类路径中吗?我已经知道权力会否决这个。
  • @user447607:不——这将(理论上)允许您切换slf4j 绑定,而无需重新编译应用程序。

标签: maven


【解决方案1】:

runtime 对于单元测试和运行时所需的依赖项很有用,但在编译时却不行。这通常是动态加载的代码,例如 JDBC 驱动程序,在程序代码中不直接引用。

将依赖项设置为运行时可确保不会意外依赖代码,并且还可以防止依赖项具有传递性。因此,例如,如果模块 A 对库 X 有运行时依赖,而模块 B 依赖于模块 A,它确实继承对库 X 的依赖。使用“provided”或“compile” 导致 B 依赖于 X。

【讨论】:

  • 但是这个链接:maven.apache.org/guides/introduction/… 说提供不是传递的。有错吗?
  • 广告传递依赖,我有一个相反的例子。在将依赖项的范围从 runtime 更改为 provided 后,它的传递依赖项不再是我构建的一部分。
  • 运行时 IS 可传递,尽管这似乎违反直觉。就 maven 的行为而言,我真的看不出编译和运行时之间有什么区别。
  • 我不同意最后一句话,如下所述:stackoverflow.com/a/6647178/704246。使用“compile”会导致 B 依赖于 X。使用“provided”会导致 B 必须显式地重新声明对 X 的依赖。
猜你喜欢
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
相关资源
最近更新 更多