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



我已经阅读了文档,有了一些了解。

请纠正或告诉我真相;根据我的理解:

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

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

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

  • import
    似乎应该从其他一些POM文件导入依赖关系,但我不知道如何/为什么,所以一点阐述将是赞赏

提供的意思是,这个jar应该在本地编译,但是在运行时,它会在类路径上由其他东西提供,所以不要在类路径中包含它。"例如,所有的web容器(例如:tomcat)都包含servlet的jar。您应该为servlet类使用provided,这样您就可以在本地编译代码,但是您不希望在部署到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,上面写着

import(仅在Maven 2.0.9或更高版本中可用)

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

认为这是在说,"把这个项目所有的依赖项都内联到这个<dependencyManagement>节中。"如果我说错了,谁来指正我

最新更新