一.依赖范围:

在pom.xml配置文件中所配置的依赖默认情况下是可以在任何地方使用的,这个地方包括main文件夹下、test文件夹下,也可以在这个项目打包的时候将这个jar包打包进去,这是默认情况。
然而在Maven项目中可以通过标签scope来控制依赖的作用范围,也就是说可以通过scope的配置来控制当前依赖是在主程序范围内有效、还是测试程序范围内有效,scope的取值如下图:

如上图,compile是默认值,可以不写,该值意味着在主程序、测试程序以及打包(运行)均有效,在大多项目开发中scope的取值都是默认值compile。其他同理。
上图中junit单元测试,仅仅在测试程序范围内有效。
二.例一:

以上述图片的maven-project01为例,
在pom.xml文件下没有设置依赖范围,那就是默认的compile,意味着该依赖的作用范围为主程序、测试程序以及打包(运行),
首先验证在主程序内是否生效,打开main包下的主程序,如下图:

如上图,判断main包下主程序中依赖是否生效,主要看能不能使用该依赖的接口或者类即可,logback依赖提供了接口Logger,如下图:

如上图,输入Logger系统会有提示slf4j包或者logback包下(注意不是logging包下)的类或者接口,说明依赖生效。
接下来看测试程序范围内是否有效,在test包下的java目录下创建一个类,如下图:

如上图,现创建一个方法来判断依赖是否生效,如下图:

如上图,输入Logger系统会有提示slf4j包或者logback包下(注意不是logging包下)的类或者接口,说明依赖生效。
最后要判断项目打包时该依赖是否参与,如下图:

如上图,首先在pom.xml文件中添加一个打包插件:
XML
<!--打包插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals><goal>single</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
其实Maven也会提供一个打包的功能(package),但是Maven提供的打包的插件只能将当前项目的资源打包进去,所依赖的JAR包是不会一起打包进去的,如下图:

接下来进行打包(package)操作,判断logback的依赖会不会打包进去,打开Maven面板,点击打包(package)后就会进行打包操作,打包后的结果如下图:

如上图,打包好的JAR包会放在target目录下,在磁盘中打开target目录,如下图:



如上图,现在看打包好的JAR包中是否包含logback的依赖,选择有dependencies的JAR包,如下图:

用记事本打开:

如上图,可知ch->qos->logback下的依赖是有的,这就说明scope配置为默认值compile时在任何范围内都是有效的,包含主程序、测试程序、打包(运行)。
三.例二:
scope配置为默认值compile时,如下图:

main包下的主程序和test包下的java包下的程序分别引入slf4j包下的Logger(也可以引入logback包下的,但不能引入logging包下,因为logging包不是特有的依赖),如下图:


接下来设置scope的值为test并刷新Maven,如下图:

如上图,
首先打开main包下的主程序,如下图:

如上图,发现main包下的主程序已经不能使用该依赖了,
再打开test包下的java包下的程序,如下图:

如上图,发现test包下的java包下的程序是可以使用该依赖的,这就是scope设置为test的效果(主程序不能使用,测试程序可以使用)。
最后测试打包时这个logback现在还会不会参与打包,先把target目录删掉,再进行Maven面板上的打包(package)操作,结果如下图:


如下图,有了一个新的target包:

打开磁盘目录:



用记事本打开有dependencies的JAR包,其中是否包含logback的依赖,如下图:

如上图,可知没有包含logback的依赖,所以打包时没有生效。
其他的scope值同理,就不演示了。