3

我一直在努力弄清楚这里提到的 Maven 提供的作用域的用途。

为什么你不应该总是有编译时范围?现实生活中的例子将不胜感激。

4

4 回答 4

3

编译

将这些 jar 文件复制到准备好的 War 文件中。

例如:hibernate-core.jar 需要在我们准备好的 War 中有。

提供 这些罐子将仅在编译时和测试时考虑

例如: servlet.jar将由部署的服务器提供,因此无需从我们准备的 War 文件中提供。

测试

这些 jar 仅用于运行测试类。

例如:Junit.jar 仅用于运行 Junit 测试类,无需部署这些。

于 2013-02-18T11:22:54.443 回答
3

compile范围依赖项仅在编译期间使用。

范围内的test- 仅在测试期间。假设您有使用 junit 或 easymock 的测试。您显然不希望最终工件依赖于它们,但希望能够在运行测试时仅依赖这些库。

provided当您运行生成的工件时,那些被标记的依赖项应该在您的类路径中。例如:您有一个 webapp,并且您依赖于 servlet 库。显然,你不应该将它打包到你的 WAR 文件中,因为 webapp 容器已经拥有它并且可能会发生冲突。

依赖项具有不同范围的原因之一是构建的不同部分可能依赖于不同的依赖项。例如,如果您只是编译代码而不执行任何测试,那么让 Maven 下载您的测试依赖项是没有意义的(当然,如果它们还没有出现在您的本地存储库中)。另一个原因是,并非所有依赖项都需要放在最终工件中(无论是程序集还是 WAR 文件),因为某些依赖项仅在构建和测试阶段使用。

于 2013-02-18T11:33:32.160 回答
2

范围在这里得到了很好的解释: https ://maven.apache.org/pom.html#Dependencies

作为参考,我复制了以下段落:

范围:该元素指的是手头任务的类路径(编译和运行时、测试等)以及如何限制依赖项的传递性。有五个可用范围:

compile - 这是默认范围,如果没有指定,则使用。编译依赖项在所有类路径中都可用。此外,这些依赖关系会传播到依赖项目。

提供- 这很像编译,但表示您希望 JDK 或容器在运行时提供它。它仅在编译和测试类路径中可用,并且不可传递。

运行时- 此范围表示编译不需要依赖项,但需要执行。它在运行时和测试类路径中,但不在编译类路径中。

test - 此范围表示应用程序的正常使用不需要依赖项,仅可用于测试编译和执行阶段。

system - 此范围类似于提供的范围,只是您必须提供明确包含它的 JAR。工件始终可用,不会在存储库中查找。

于 2014-03-05T21:44:01.713 回答
1

有几个原因您可能不希望所有依赖项都成为默认编译范围

  1. 通过指示不同的范围来减小最终工件(jar,war ...)的大小。
  2. 当你有一个多模块项目时,你可以让每个模块都有自己的依赖版本
  3. 通过提供的范围避免类版本冲突,例如,如果您要将war文件部署到weblogic服务器,则需要摆脱一些javax jar,如javax.servlet、javax.xml.parsers、JPA jar等。否则你最终可能会出现类冲突错误。
于 2013-02-18T11:28:41.383 回答