maven scope 常用作用域整理
本文主要是梳理maven dependency依赖常见scope的理解。
文章目录
maven是什么?
Apache Maven,是一个软件项目管理及自动构建工具,由Apache软件基金会所提供。使用maven进行依赖管理时,会在 pom.xml
文件中添加 dependency
标签,并添加对于的依赖坐标,例如:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
其中,各个标签的作用如下:
groupId
:依赖类库的坐标,一般是依赖类库所在包的全路径(普遍为公司/组织域名的反写);artifactId
:依赖类库的坐标,是依赖类库的项目名称;version
:依赖类库版本信息;scope
:依赖类库的作用域,可设置的值有:compile
、test
、provided
、runtime
、system
等。
scope 常见作用域
下面将常见scope
的值整理成表格,其中Y
表示生效,-
表示不生效;主代码区域指的是main->java
目录下的代码编辑区域;测试代码指的是main->test
目录下的单元测试代码编辑区域;打包指的是将项目打包成war
或jar
等可运行包。
作用域 | 对于主代码 | 对于测试代码 | 打包(即运行时) | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | - | Y | JDBC Driver Implementation |
compile
:是Maven依赖的默认scope
,使用该值则表示添加的依赖类库会在项目中所有环境下(开发、测试、运行时)中都存在;test
:表示添加的依赖类库只能在编写及运行单元测试代码时使用,在主代码区域及打包中是无法直接引用该类库中的相关类;provided
:表示添加的依赖类库只会在主代码区和单元测试区里面使用,但是打包项目的时候是不会包含该依赖类库,典型的就是在打包war
部署到Tomcat
时,需要将servlet-api
依赖项排除掉,因为Tomcat
中已经包含该类库了;runtime
:则是跟provided
相反,只会在项目打包时被引入,典型的就是jdbc
相关驱动,因为jdbc
驱动都是实现了jdbc
相关接口,所以在主代码区域和单元测试区编写代码时,只需要使用内置的jdbc
相关接口,不关心具体实现,具体实现类可以在项目打包及运行时再添加到项目中。