这些Maven依赖范围之间有什么区别:提供/编译/系统/导入

时间:2013-06-03 23:54:36

标签: maven maven-2

我已阅读文档并有所了解。

请更正或告知我真相;根据我的理解:

  • provided
    依赖关系必须在运行代码的计算机上,并且必须包含在路径中

  • compile
    依赖关系不在运行代码的计算机上,因此将它们包含在构建

  • system
    与提供的完全相同,但您需要严格存在于jar文件中的依赖项

  • import左看它似乎应该从其他POM文件中导入依赖项,但我不知道如何/为什么,所以一点点阐述将不胜感激

2 个答案:

答案 0 :(得分:51)

provided你错了/含糊不清。这意味着,“这个jar应该是在本地编译的,但是在运行时它会被其他东西提供,所以不要把它包含在类路径中。”例如,所有Web容器(例如:tomcat)都包含servlet的jar。您应该将provided用于servlet类,以便可以在本地编译代码,但是您不希望覆盖tomcat在部署时为您提供的servlet类。


system表示“这些依赖关系在我的系统上,我想直接指向它们”。如果可以,您希望避免这种情况,因为另一台计算机上的另一个人不一定具有这些依赖关系。

provided之间的区别更容易显示:

<dependency>
  <groupId>javax.sql</groupId>
  <artifactId>jdbc-stdext</artifactId>
  <version>2.0</version>
  <scope>system</scope>
  <systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>

了解<systemPath>的情况如何?这就是区别。如果知道如何从存储库获取依赖关系,则不要使用provided指定路径。 system仅从您的文件系统中获取。


我从来没有听说过import。 @JigarJoshi链接到http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html,后面写着

  

导入(仅适用于Maven 2.0.9或更高版本)

     

此范围仅用于<dependencyManagement>部分中pom类型的依赖项。它表示应该用该POM部分中的依赖项替换指定的POM。由于它们被替换,具有导入范围的依赖性实际上并不参与限制依赖的传递性。

认为这就是说,“了解这个项目的所有依赖项,并在这个<dependencyManagement>部分内联它们。”如果我错了,有人会纠正我。

答案 1 :(得分:17)

请在Maven中找到范围的确切含义

我是指Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

依赖范围用于限制依赖项的传递性,还用于影响用于各种构建任务的类路径。

有6个范围:

  • <强>编译

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

  • <强>提供

    这很像compile,但表示您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。

  • <强>运行时

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

  • <强>测试

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

  • <强>系统

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

  • 导入(仅适用于Maven 2.0.9或更高版本)

    此范围仅用于部分中pom类型的依赖项。它表示应该用POM的部分中的依赖项替换指定的POM。由于它们被替换,具有导入范围的依赖性实际上并不参与限制依赖的传递性。