工欲善其事,必先利其器之 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 中生效。
- compile: 默认值,此类型的依赖在主程序编译,测试用例编译、运行生效,项目打包时也会打进包里(也就是运行时 classpath)
- test: 只在测试用例编译、执行时生效,主程序编译及项目打包时都不会生效
- provided: 主程序编译,测试用例编译、执行时生效,但是程序打包时不会生效,也就是不会被打进包里,因为程序运行时的环境会提供此类型的依赖,打进包里反而可能出现依赖冲突的情况
- runtime: 主程序编译、测试用例编译时不会生效,测试用例执行以及程序打包时会生效
- 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 仓库之外的类库文件 |
热门相关:洪荒二郎传 大妆 买妻种田:山野夫君,强势宠! 本法官萌萌哒 异世修真邪君