更好地理解Maven范围

时间:2013-02-18 11:15:33

标签: maven

我一直在努力弄清楚Maven提供的范围使用是什么 如上所述here

为什么不总是有编译时间范围?真实的例子将非常感激。

4 个答案:

答案 0 :(得分:3)

<强>编译

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

Ex:hibernate-core.jar需要在我们准备好的战争中。

<强>提供 这些罐子只会在编译时和测试时间考虑

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

<强>测试

只有运行测试类才需要这些jar。

Ex:Junit.jar只需要运行Junit测试类,不需要部署它们。

答案 1 :(得分:3)

compile范围的依赖关系仅在编译期间使用。

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

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

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

答案 2 :(得分:2)

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

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

  

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

     

<强>编译    - 这是默认范围,如果未指定,则使用。所有类路径中都提供了编译依赖项。而且,那些   依赖项传播到依赖项目。

     

提供 - 这是   很像编译,但表示你期望JDK或容器   在运行时提供它。它仅适用于编译和   测试类路径,并且不是传递的。

     

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

     

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

     

系统 - 此范围是   类似于提供,除了你必须提供JAR   明确地包含它。工件始终可用,而不是   在存储库中查找。

答案 3 :(得分:1)

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

  1. 通过指示不同的范围来减小最终工件(jar,war ...)的大小。
  2. 当你有一个多模块项目时,你有能力让每个模块拥有它自己的依赖版本
  3. 通过提供的范围避免类版本冲突,例如,如果要将war文件部署到weblogic服务器,则需要删除一些javax jar,例如javax.servlet,javax.xml .parsers,JPA jar等等,否则你可能会遇到类碰撞错误。