首先贴出maven依赖配置语法java
<dependencies> <dependency> <groupId></groupId> <artifactId>spring-core</artifactId> <version></version> <type></type> <scope></scope> <optional></optional> <exclusions> <exclusion> </exclusion> <exclusions> </dependency> </dependencies>
groupId,artifactId,version就再也不介绍了,这是基本坐标。spring
type为依赖的类型,scope依赖的范围,optional标记依赖是否可选,exclusions用来排除传递性依赖。api
基础概念如上,今天重点理解依赖的范围。maven
在maven构建的时候,会有三套classpath(就比如java的classpath)。在编译项目主代码的时候会用到一套classpath,在进行编译和测试的时候也会用到一套classpath,在真正运行的时候,也会用到一套classpath。ide
依赖的范围有如下几种:compile,test,provided,runtime,system,import。测试
其中system通常不推荐,由于从字面意思就能够了解到引用了系统的环境变量,因此极可能不具有可移植性。spa
compile是默认的依赖范围。在没有写scope的时候,就是指定了compile范围。code
test,测试依赖范围。在我以前使用maven的时候,junit的scope就是test。xml
provided,已提供的依赖范围。此依赖在编译和测试classpath有效,在运行时无效。就行servlet api,编译的时候用到了,运行的时候就不须要了。接口
runtime,运行时依赖范围。此依赖在测试和运行的时候有效,可是在编译的时候无效。就像jdbc驱动,项目主代码的编译只须要提供jdk提供的jdbc驱动,只有在执行测试或者运行项目的时候才须要实现上述接口的具体jdbc驱动。
import,导入依赖范围。(暂时没学到)
scope | 编译 | 测试 | 运行 | example |
compile | Y | Y | Y | spring-core |
test | -- | Y | -- | JUnit |
provided | Y | Y | -- | servlet-api |
runtime | -- | Y | Y | JDBC驱动实现 |
system | Y | Y | -- | 本地的,maven仓库以外的类库文件 |