我已阅读文档并有所了解。
请更正或告知我真相;根据我的理解:
provided
依赖关系必须在运行代码的计算机上,并且必须包含在路径中
compile
依赖关系不在运行代码的计算机上,因此将它们包含在构建
system
与提供的完全相同,但您需要严格存在于jar文件中的依赖项
import
左看它似乎应该从其他POM文件中导入依赖项,但我不知道如何/为什么,所以一点点阐述将不胜感激
答案 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。由于它们被替换,具有导入范围的依赖性实际上并不参与限制依赖的传递性。