工欲善其事,必先利其器之 Maven (一)

1. scope 概念

maven 在引入依赖时,配置上有一个 scope 标签,例如:

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.1.0</version>
    <scope>runtime</scope>
</dependency>

例子中的 <scope>runtime</scope> 表示运行时的依赖范围,不同的 scope 对于项目在编译,测试,打包时会产生不同的效果,了解不同类型的 scope 可以让开发者在引入依赖时更加准确,避免开发、测试以及最终打包发布时出现各种奇奇怪怪的问题。

scope 是用来规定依赖与三种 classpath 的关系的,分别是:编译 classpath,测试 classpath,运行时 classpath。

这三种 classpath 分别也对应着 maven 中主程序编译,测试用例编译、执行,主程序打包这几个流程。

设置 scope 是为了使引入的依赖在该生效的 classpath 中生效,在不该生效的 classpath 中无效。这样才能避免最终运行的程序中出现依赖冲突或者依赖缺失的情况。

2. scope 类型

依赖的 scope 的类型一共有 5 个,常用的是前 4 个,每一个 scope 的类型控制依赖会在某一个或者某几个 classpath 中生效。

  1. compile: 默认值,此类型的依赖在主程序编译,测试用例编译、运行生效,项目打包时也会打进包里(也就是运行时 classpath)
  2. test: 只在测试用例编译、执行时生效,主程序编译及项目打包时都不会生效
  3. provided: 主程序编译,测试用例编译、执行时生效,但是程序打包时不会生效,也就是不会被打进包里,因为程序运行时的环境会提供此类型的依赖,打进包里反而可能出现依赖冲突的情况
  4. runtime: 主程序编译、测试用例编译时不会生效,测试用例执行以及程序打包时会生效
  5. system: 同 provided,只不过使用时必须通过 <system-Path> 元素显式指定依赖文件路径,一般与本机强绑定,可能造成构建的不可移植,应谨慎使用。

简洁版的对应关系描述可以看下面的表格。

3. scope 与 classpath 关系

依赖范围(scope) 编译 classpath 有效 测试 classpath 有效 运行时 classpath 有效 例子
compile Y Y Y spring-core
test N Y N JUnit
provided Y Y N servlet-api
runtime N Y Y JDBC 驱动
system Y Y N 本地的,Maven 仓库之外的类库文件

热门相关:洪荒二郎传   大妆   买妻种田:山野夫君,强势宠!   本法官萌萌哒   异世修真邪君