Maven依赖中的scope作用域

打印 上一主题 下一主题

主题 2062|帖子 2062|积分 6186

1.Maven作用

Maven 的一个哲学是惯例优于配置 (Convention Over Configuration), Maven 默认的依赖配置项中,scope 的默认值是 compile。依赖关系范围(Dependency Scope)用于限制依赖关系的可传递性,并确定何时将依赖关系包括在类路径中。
2.Scope作用域的6个范围

compile

  • 这是默认范围,假如未指定则利用。编译&测试&运行的classpath都有用。此外,这些依赖项会传播到相关项目。
provided

  • 编译和测试可用(Web容器还没有介入),不会被传递依赖且不会被打包进去。比方,在为 Java Enterprise Edition 构建 Web应用步伐时,您将对 Servlet API 和相关 Java EE API 的依赖关系设置为 provided。运行时Web容器提供了这些类。也有自身内部提供sdk场景时,比力熟悉利用的系统依赖的情况。sdk不需要运行时单独提供所需依赖jar由引入利用的系统项目提供,也制止依赖jar的版本不一致。
runtime

  • 此作用域表明依赖关系不是编译必须的,而是执行所需的。 Maven 在运行时和测试类路径中包含此范围的依赖项,但不包括编译类路径。最典型的例子是 JDBC 的驱动,编译时只需要提供驱动的 API 即可,在运行和测试阶段,需要加载到具体的驱动实现。
test

  • 此范围表明该依赖关系对于正常利用该应用步伐不是必须的,并且仅在测试编译和执行阶段可用。此范围不是可传递的。通常,此范围用于 JUnit 和 Mockito 等测试库。假如这些库用于单元测试(src/test/java),而不用于模子代码(src/main/java),则也可用于非测试库,比方 Apache Commons IO。
system

  • 该范围类似于所提供的范围,除了必须提供显式包含它的JAR。从依赖关系上说,类似与provided类似。但是被依赖项不会从maven仓库中查找而是从本地文件系统探求,一定需要共同systemPath属性利用。
import

  • 此范围仅受  部分中 pom 范例的依赖项支持。它指示依赖关系将被指定的 POM 的 部分中的依赖关系有用列表替换。由于已替换它们,因此具有导入范围的依赖项实际上并不参与限制依赖项的可传递性。
如下表所示,每个范围( 除外)以不同的方式影响传递依赖。假如将依赖项设置为左栏中的作用域,则该依赖项的可传递依赖项与顶行的作用域之间会导致主项目中的依赖项,其作用域列在交织点处。假如没有列出作用域,则表示省略了依赖关系。


传递性依赖:A->B,B->C,则 A->C。这是传递性依赖。依赖是有范围的,A->B,B->C 的依赖范围决定了 A->C 的依赖范围。
比方:
  1. A–>B–>C。当前项目为 A,A 依赖于 B,B 依赖于 C。知道 B 在 A 项目中的 scope,那么怎么知道 C 在 A 中的 scope呢?
  2. 1.当 C 是 test 或者 provided 时,C 直接被丢弃,A 不依赖 C;
  3. 2.否则 A 依赖 C,C 的 scope 继承于 B 的 scope
复制代码
3.maven中三种classpath


  • 编译时 classpath:编译项目代码,依赖的 jar 会被引入到 classpath
  • 测试时 classpath:编译和执行测试部分代码,如单元测试,集成测试,依赖会被引入到 classpath
  • 运行时 classpath:实际运行代码的时间,依赖的 jar 会被引入到 classpath
4.总结

主要需要把握以下几种 scope:

  • compile:默认值,对编译classpath、测试classpath、运行classpath都有用。
  • provided:编译和测试可用,不会被传递依赖,不会被打包。
  • test:测试时可用,不会被打包,不会被传递依赖。
  • runtime:运行和测试时需要,但编译时不需要。
参考

官方网站:Maven Dependency Scope
mvn dependency:tree的详解

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表