学技术,自然要先上官网,所以先奉上官网Dependency Scope的链接
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
闻过了官网“英文”的气息之后进入正题,摘取我们想要的Dependency Scope信息,翻译成中文也就是maven依赖的范围属性,落地到我们真实的pom文件里面如下
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
看到这个scope仿佛终于看到了曙光,他一直出现在我们平时的pom文件中,但是我们对他熟悉又陌生,下面我们跟着官网学习maven中不可或缺的scope属性
首先奉上官方的属性列表
- compile
- provided
- runtime
- test
- system
- import
1)首当其冲的自然是,官网列表的带头大哥compile,官网中的第一句解释是这样的:“This is the default scope,”,翻译过来就是这是默认的scope,也就是说我们虽然平时不怎么写scope属性,但是scope无时无刻不伴随着我们的依赖发挥着作用,compile作为强硬的带头大哥,所带的buff自然也非常强硬,无论是项目的编译还是测试,抑或是后续的打包都会参与,所以作为小白经常遇到依赖错误的时候第一步就是删除scope然后求神拜佛让程序恢复正常
2)provided相对于带头大哥compile缺席了打包这一环节,最最常见的如下
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>
部署tomcat服务时经常遇到的就是servlet-api冲突,因为tomcat本身已经提供了servlet-api,如果web依赖中也存在的话就会冲突报错,加上provided可以让相关依赖在打包时不被打进去
3)runtime相对于带头大哥compile缺席了编译这一环节,runtime是一个很难被理解或者很容易被混淆的点,很多人很难去理解他到底有啥用,避免编译去使用反射的好处在哪里?目前比较常见的场景可能是JDBC依赖关系的应用场景,因为关心到代码的通用性,不用编译代码的确可以做到在运行时中与相关的实现依赖直接绑定,但是,个人而言,除非是JDBC这种一般性的场景外,为了避免未知性的混淆,慎用runtime
4)test 就比较好理解了,只参与测试代码编译和执行工作,如最常见的junit单元测试,这里也就不再赘述
5)system 与 import 因为在实际工作中极为少用,我就借助一下官方的解释
system:"This scope is similar to
provided
",翻译过来也就是类似于provided,只不过他的依赖取自当前系统,配合systemPath一起使用,使用绝对路径import:"This scope is only supported on a dependency of type
pom
in the<dependencyManagement>
section",import只支持type=pom和dependencyManagement配合使用,如下
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.xxx</groupId>
<artifactId>xxxxx</artifactId>
<version>xxxxxx</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
可用于实现依赖的多继承