40

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

请更正或告知我真相;据我了解:

  • provided
    依赖项必须在您运行代码的机器上,并且必须包含在路径中

  • compile
    依赖项不会在运行代码的机器上,因此将它们包含在构建中

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

  • import
    似乎它应该从其他一些 POM 文件中导入依赖项,但我不知道如何/为什么,所以稍微详细说明一下将不胜感激

4

2 回答 2

57

你错了/模棱两可provided。这意味着,“这个 jar 应该在本地编译,但它会在运行时由其他东西在类路径中提供,所以不要将它包含在我的类路径中。” 例如,所有 Web 容器(例如:tomcat)都包含 servlet 的 jar。您应该使用providedservlet 类,以便您可以在本地编译代码,但您不想在部署到 tomcat 时覆盖 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 或更高版本中可用)

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

认为这是在说,“获取该项目的所有依赖项并将它们内联到本<dependencyManagement>节中。” 如果我错了,有人纠正我。

于 2013-06-03T23:58:46.480 回答
21

请在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 部分中的依赖项。由于它们被替换,具有导入范围的依赖项实际上并不参与限制依赖项的传递性。

于 2014-10-10T13:27:41.823 回答