scope标签
在dependencies/dependency
标签内,可选值有compile(默认值),test,provided,system,runtime,import
compile
:在项目实际运行时真正要用到的jar包都是以compile的范围进行依赖 ,比如第三方框架SSM所需的jar包test
:测试过程中使用的jar包通常以test的范围依赖进来 , 比如junit依赖provided
:在开发过程中需要用到的“服务器上的 jar 包”通常以provided的范围依赖进来 , 比如 servlet-api、jsp-api测试依赖的范围
测试compile , test , provided
三种依赖范围的对比
main目录(空间) | test目录(空间) | 开发过程(时间) | 部署到服务器(时间) | |
---|---|---|---|---|
compile | 有效 | 有效 | 有效 | 有效(参与打包) |
test | 无效 | 有效 | 有效 | 无效(不参与打包) |
provided | 有效 | 有效 | 有效 | 无效(不参与打包) |
验证compile范围对main/test目录有效
: 判断main/test目录下的某个类是否可以使用以compile范围导入的pro01--maven-java依赖中的Calculator类
验证test范围对main目录无效
: 在主体程序Calculator中导入org.junit.Test
这个注解,执行Maven编译命令失败说明无效
[ERROR] /D:/maven-workspace/space201026/pro01-maven-java/src/main/java/com/atguigu/maven/Calculator.java:程序包org.junit不存在
验证test和provided范围不参与服务器部署
: 通过compile范围依赖的jar包会放入war包,通过test范围依赖的jar包不会放入war包
验证provided范围对test目录有效
: 在pro02-maven-web的测试程序CalculatorTest中使用servlet-api.jar包中的类,执行Maven编译命令成功说明有效
package com.atguigu.maven;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import org.junit.Test;
import com.atguigu.maven.Calculator;
// 静态导入的效果是将Assert类中的静态资源导入当前类
// 这样一来,在当前类中就可以直接使用Assert类中的静态资源,不需要写类名
import static org.junit.Assert.*;
public class CalculatorTest{
@Test
public void testSum(){
//....
}
}
测试依赖的传递性
传递的原则
: 在A依赖B,B依赖C的前提下,在A没有配置对C的依赖的情况测试C是否能够传递到A
验证compile范围的依赖可以传递
: 编辑pro01-maven-java工程根目录下pom.xml文件, 让当前工程可以使用commons-logging依赖中的类
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>4.0.0.RELEASEversion>
dependency>
[INFO] com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT
#junit对hamcrest-core的依赖范围是compile,所以可以传递
[INFO] +- junit:junit:jar:4.12:test
#这里显示test是因为我们是以test范围引入的junit,并不是说junit对hamcrest-core的依赖范围是test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] \- commons-logging:commons-logging:jar:1.1.1:compile
pro02-maven-web工程也可以使用commons-logging依赖中的类
<dependency>
<groupId>com.atguigu.mavengroupId>
<artifactId>pro01-maven-javaartifactId>
<version>1.0-SNAPSHOTversion>
<scope>compilescope>
dependency>
> [INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT,
> [INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
> [INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
> [INFO] \- commons-logging:commons-logging:jar:1.1.1:compile
验证test范围不能传递依赖
: 在pro01-maven-java加入了的junit
依赖,但是在pro02-maven-web工程中查看依赖树的时候并没有看到junit
<--当前工程是pro01-maven-java-->
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
验证provided范围不能传递依赖
: 在pro01-maven-java工程中加入了servlet-api的依赖, 但是在pro02-maven-web工程中查看依赖树的时候并没有看到该依赖
<--当前工程是pro01-maven-java-->
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
> [INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT
> [INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
> [INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
> [INFO] \- commons-logging:commons-logging:jar:1.1.1:compile
配置依赖排除
当A依赖B,B依赖C而且C可以传递到A的时候,A如果不想要C,可以使用exclude标签
在A里面把C排除掉(阻止某些jar包的传递可以避免jar包之间的冲突)
配置对commons-logging依赖
的排除: 使用exclude标签指定要排除的具体的坐标并且不需要写版本号 , 只会阻止依赖传递到当前工程不影响其他依赖的传递
<dependency>
<groupId>com.atguigu.mavengroupId>
<artifactId>pro01-maven-javaartifactId>
<version>1.0-SNAPSHOTversion>
<scope>compilescope>
<exclusions>
<exclusion>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
exclusion>
exclusions>
dependency>
运行mvn dependency:tree
命令发现pro02-maven-web工程下的spring-core依赖下面已经没有commons-logging依赖
[INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile