1.scope
1.1.官方文档翻译
依赖关系范围(Dependency Scope)用于限制依赖关系的可传递性,并确定何时将依赖关系包括在类路径中。
有6个范围:
compile
- 这是默认范围,如果未指定则使用。编译依赖项在项目的所有类路径中均可用。此外,这些依赖项会传播到相关项目。
provided
- 这很像编译,但是表明您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java Enterprise Edition 构建 Web应用程序时,您将对 Servlet API 和相关 Java EE API 的依赖关系设置为 provided,因为 Web 容器提供了这些类。具有此作用域的依赖项将添加到用于编译和测试的类路径中,而不是运行时类路径中。它不是可传递的。
runtime
- 此作用域表明依赖关系不是编译必需的,而是执行所需的。 Maven 在运行时和测试类路径中包含此范围的依赖项,但不包括编译类路径。最典型的例子是 JDBC 的驱动,编译时只需要提供驱动的 API 即可,在运行和测试阶段,需要加载到具体的驱动实现。
test
- 此范围表明该依赖关系对于正常使用该应用程序不是必需的,并且仅在测试编译和执行阶段可用。此范围不是可传递的。通常,此范围用于 JUnit 和 Mockito 等测试库。如果这些库用于单元测试(src/test/java),而不用于模型代码(src/main/java),则也可用于非测试库,例如 Apache Commons IO。
system
- 该范围类似于所提供的范围,除了必须提供显式包含它的JAR。该工件始终可用,并且不会在存储库中查找。
import
- 此范围仅受 <dependencyManagement> 部分中 pom 类型的依赖项支持。它指示依赖关系将被指定的 POM 的 <dependencyManagement>部分中的依赖关系有效列表替换。由于已替换它们,因此具有导入范围的依赖项实际上并不参与限制依赖项的可传递性。
如下表所示,每个范围(<import> 除外)以不同的方式影响传递依赖。如果将依赖项设置为左栏中的作用域,则该依赖项的可传递依赖项与顶行的作用域之间会导致主项目中的依赖项,其作用域列在交叉点处。如果没有列出作用域,则表示省略了依赖关系。
compile | provided | runtime | test | |
---|---|---|---|---|
compile | compile(*) | - | runtime | - |
provided | provided | - | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
传递性依赖:A->B,B->C,则 A->C。这是传递性依赖。依赖是有范围的,A->B,B->C 的依赖范围决定了 A->C 的依赖范围。
1.2.maven 的三种classpath
编译时 classpath:编译项目代码,依赖的 jar 会被引入到 classpath
测试时 classpath:编译和执行测试部分代码,如单元测试,集成测试,依赖会被引入到 classpath
运行时 classpath:实际运行代码的时候,依赖的 jar 会被引入到 classpath
1.3.小节
主要需要掌握以下几种 scope:
-
compile:默认值,对编译classpath、测试classpath、运行classpath都有效。
-
provided:编译和测试可用,不会被传递依赖,不会被打包。
-
test:测试时可用,不会被打包,不会被传递依赖。
-
runtime:运行和测试时需要,但编译时不需要。
2.查看项目的依赖路径
2.1.命令行
使用 mvn dependency:tree 命令可以在控制台查看依赖输出:
+- javax.servlet:javax.servlet-api:jar:3.1.0:provided
+- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.39:provided
| - org.apache.tomcat:tomcat-annotations-api:jar:9.0.39:provided
- org.apache.tomcat.embed:tomcat-embed-jasper:jar:9.0.39:provided
+- org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.39:provided
- org.eclipse.jdt:ecj:jar:3.18.0:provided
+-
标记一个依赖,-
来表示同一层依赖的最后一个节点
2.2.借助 IDEA
使用 Intellij IDEA 查看则更加轻松。首先为大家揭示一下快捷键的位置:
另外再给大家看一下依赖的演示图:
同时,对于当前项目而言,筛选不同的依赖范围 scope,会得到不同的依赖路径。