我已阅读文档并有所了解。
请更正或告知我真相;据我了解:
provided
依赖项必须在您运行代码的机器上,并且必须包含在路径中compile
依赖项不会在运行代码的机器上,因此将它们包含在构建中system
与提供的完全相同,但您需要严格存在于 jar 文件中的依赖项import
似乎它应该从其他一些 POM 文件中导入依赖项,但我不知道如何/为什么,所以稍微详细说明一下将不胜感激
你错了/模棱两可provided
。这意味着,“这个 jar 应该在本地编译,但它会在运行时由其他东西在类路径中提供,所以不要将它包含在我的类路径中。” 例如,所有 Web 容器(例如:tomcat)都包含 servlet 的 jar。您应该使用provided
servlet 类,以便您可以在本地编译代码,但您不想在部署到 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>
节中。” 如果我错了,有人纠正我。
请在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 部分中的依赖项。由于它们被替换,具有导入范围的依赖项实际上并不参与限制依赖项的传递性。