Maven 依赖问题:Provided 和 Compile 依赖一起工作

Maven Dependency Issues: Provided and Compile dependencies working together

我继承了一个包含数十个 "provided" 作用域依赖项的 Maven 项目。我正在努力插入一个新的依赖项,它本身是 dependent 在前面提到的 "provided" 依赖项之一上。此新依赖项的范围为 "compile"/default 标记。

应用程序在没有添加新依赖项的情况下工作。使用新依赖项成功编译应用程序后,应用程序在 运行 时间失败,因为新依赖项找不到 "provided" 依赖项。

是否所有 "provided" 依赖项都必须与 "provided" 依赖项一起使用(并且与任何其他范围相同 - 它们只适用于它们的种类)?我想不出任何其他解释为什么新的 default/"compile" 依赖项不能与现有的 "provided" 依赖项一起工作。正如我所提到的,它们在引入任何新的依赖项之前就已明确提供并起作用。任何帮助表示赞赏!我一直在使用 maven documentation on scopes and this SO post.

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


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

  • 编译,你说的是"I need this to compile my code and I need it at run-time too"
  • 提供,你说的是"I need this to compile my code, but at run-time someone else will provide it"
  • 运行时间,你说的是"I don't need this to compile my code, but will need it at run-time"

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

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

运行time 是非常常见的范围,当存在 API 工件和实现工件时,例如 slf4j-apislf4j-log4j - 那么你在编译时只需要 API,但在 运行 时需要 API 和实际实现。