1、maven的依赖范围
依赖的范围,使用scope表示
在我们添加依赖jar包的代码到pom文件的依赖属性中时,
通常会在依赖坐标之下添加一个<scope></scope>,
该标签中填写的关键词表示这个依赖作用的范围。
--scope中可填写的值有:
compile、test、provide三个
--依赖添加scope,表示有使用范围,什么是使用范围?
就是表示这个依赖在maven构建项目的哪个阶段起作用
--maven构建项目包括:清理、编译、测试、打包、安装、部署这几个过程阶段
如下单元测试junit依赖写法:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
--依赖范围是test:表示在项目构建过程中只在测试阶段使用该jar
什么意思呢?
就是说我们在pom文件中的依赖有这样包含test范围的,在项目构建的编译主程序时是没有这个依赖的,
但是在编译测试程序或者测试阶段,这个依赖才参与进来。
非常明显的就是我们在主程序中写好方法后,写个主方法,然后调用junit中Assert类中的比较方法
Assert.assertEquals(30,res);
就会发现需要导包,但是junit还得自己添加。
而在测试程序使用上面方法只需要导入相应的junit的Assert类就可以了,不需要导junit的jar包
--当依赖范围为compile时:表示编译、测试、打包、安装、部署这些过程都可以使用这个jar包
--默认不写范围scope时就是compile
--当依赖范围为provide时:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
--表示在项目构建到打包和安装阶段该jar包不起作用,上面的servlet的jar包,
我们打包web项目为war文件,部署到Tomcat服务器中,而Tomcat的lib目录是有servlet规范的jar包的,
启动服务器,我们的web项目运行所需要的servlet依赖用的是服务器中的,
所以打包时就没必要将servlet的jar包封装到war文件中,所以需要provide,表示以后会有提供者。
如果是compile的话,打包后的文件中WEB-INF目录下lib就是这些依赖的jar包存放位置
![](https://img2020.cnblogs.com/blog/2432278/202108/2432278-20210808184927794-143999318.png)
2、maven常用属性
Maven的常用属性设置
2.1 全局变量设置
在Maven的pom.xml文件中,<properties>标签用来定义全局变量
--如maven的属性设置,如下:
其中<project.build.sourceEncoding>表示的是属性名或者说是一个变量名,UTF-8表示该属性的值
<properties>
<!--设置Maven构建项目时用的编码方式,设为utf-8避免中文乱码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--设置Maven编译代码时用的JDK版本-->
<maven.compiler.source>1.7</maven.compiler.source>
<!--设置Maven运行程序时用的JDK版本-->
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
--Maven全局变量设置
1、自定义属性
在<properties>标签中通过自定义标签声明变量(标签名就是变量名),然后把值赋上去
2、使用
在pom文件中的其他位置,如依赖中使用"${自定义标签名}"来表式变量值
--这样做的优点和作用如下展示:
有时候我们需要用到一个框架,例如spring框架,这个框架有许多的项目,
我们的项目只需要spring框架中的一部分项目,所以我们需要在依赖中添加spring框架各个项目的坐标依赖,
我们要保证这些项目的版本一致,那么坐标中的version属性都是一样的,
所以我们自定义一个属性名为<spring.version>的变量,赋上值,
然后在spring各项目的依赖的坐标的version属性中用${spring.version}代替就行了,
到时候需要修改使用版本的时候在properties中修改对应属性值就可以了,非常省事。
--所以自定义全局变量一般是定义依赖的版本号
<properties>
<!--设置Maven构建项目时用的编码方式,设为utf-8避免中文乱码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--设置Maven编译代码时用的JDK版本-->
<maven.compiler.source>1.7</maven.compiler.source>
<!--设置Maven运行程序时用的JDK版本-->
<maven.compiler.target>1.7</maven.compiler.target>
<!--自定义属性,spring框架版本-->
<spring.version>5.2.5</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframwork</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframwork</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframwork</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
2.2 指定资源位置插件设置
<build>
<resources>
<resource>
<!--表示编译时在src/main/java目录下的-->
<directory>src/main/java</directory>
<!--所有.properties、.xml类型的文件可以被扫描到-->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!--filtering的值false表示不启用过滤器,上面include已经是过滤操作了-->
<filtering>false</filtering>
</resource>
</resources>
</build>
如上面build属性所示:
1、在上面没有设置resources属性时,maven执行编译时,
默认只把resources中的所有文件拷贝到生成的target目录下的classes目录中,
而如果src/main/java/com/studymyself目录中除了有java文件外还有一个a.propertis文件,
maven是不予理睬的。
2、如果有了上面的设置,Maven进行编译时就会把要求的文件类型扫描到,并且拷贝到对应目录下,
1中就会将a.properties文件拷贝到target/classes/com/studymyself目录下,并不是拷贝到classes下。
--这样做是因为有时候开发,有些文件不一定会放在resources目录中,而是放到java目录中的一些程序包下。
这就需要配置resources属性。