为了账号安全,请及时绑定邮箱和手机立即绑定

Maven 依赖问题:提供和编译依赖一起工作

Maven 依赖问题:提供和编译依赖一起工作

慕工程0101907 2021-08-25 10:20:13
我继承了一个带有数十个“提供”范围依赖项的 Maven 项目。我正在插入一个新的依赖项,该依赖项本身依赖于前面提到的“提供”依赖项之一。这个新依赖的范围是“compile”/default 标签。该应用程序无需添加新的依赖项即可运行。使用新依赖项成功编译应用程序后,应用程序在运行时失败,因为新依赖项找不到“提供的”依赖项。是否有必要让所有“提供的”依赖项与“提供的”依赖项一起使用(并且与任何其他范围相同——它们只适用于它们的种类)?我想不出任何其他解释为什么新的默认/“编译”依赖项不能与现有的“提供”依赖项一起使用。正如我所提到的,在引入任何新依赖项之前,它们已经明确提供并起作用。
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

问题不在于您的编译依赖项依赖于提供的依赖项,而是提供的依赖项在运行时不存在。我只能猜测为什么会这样,但一个可能的解释是它已经丢失了,只是之前没有人在运行时实际使用过该依赖项,所以这无关紧要。


本质上,通过建立依赖关系:

  • compile,你是说“我需要这个来编译我的代码,我在运行时也需要它”

  • 提供,你说“我需要这个来编译我的代码,但在运行时其他人会提供它”

  • 运行时,你说“我不需要它来编译我的代码,但在运行时需要它”

compile是默认和最常见的作用域,因为大多数依赖项在编译时和运行时都需要,所以告诉 Maven 在这两种情况下传播它们是有意义的。

提供的是其他人将在运行时提供库的情况(例如,servlet 容器通常将servlet-api.jar作为基础结构的一部分提供)。然而,当您需要针对某个库进行编译时,此范围有时也(ab)用于奇怪的情况,但实际上将/可能不会在运行时使用它(例如可选功能)。对于您的情况,同样重要的是,如果依赖项实际上并未在运行时提供并且尝试在运行时使用它,则应用程序只会在提供的依赖项上失败。

当有 API 工件和实现工件时,运行时是非常常见的范围,例如slf4j-apislf4j-log4j- 然后您只需要在编译时使用 API,但在运行时需要 API 和实际实现。


查看完整回答
反对 回复 2021-08-25
  • 1 回答
  • 0 关注
  • 273 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号