maven常用scope作用域:compile、runtime、provided、test、system。
compile:scope的默认值,编译期、运行期有效,常见的jar比如:spring-core。会打包到项目war包中。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
<scope>compile</scope>
</dependency>
runtime:运行期有效,编译期无效(jar中的类无法显示的在程序中引用,否则编译不通过),常见的jar比如:mysql-connector-java。会打包到项目war中。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
<scope>runtime</scope>
</dependency>
provided:编译期、运行期有效,常见的jar比如:servlet-api。不会打包到项目war中。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
test:jar中的类,只针对测试模块,不能用在main程序中,常见的jar比如:junit。不会打包到项目war中。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
system:一般配合systemPath节点使用。不会打包到项目war中。
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/xercesImpl-2.11.0.jar</systemPath>
</dependency>
其他说明:
compile依赖范围:默认的依赖范围,开发时需要,部署时也需要(运行时servlet容器不会提供),一般的就是这样。
test依赖范围:主程序(main)是无法依赖test范围的jar的,开发时就不可以(那些jar主程序也是用不到的),只有测试程序可以依赖。要知道,测试程序常规是不会参与打包的,test范围的依赖也不参与打包,只是在开发阶段会用到,或者maven编译(compile)时会执行测试程序。
如果开发时主程序可以依赖test范围的jar,那么打包时由于test范围的jar不参与打包,所以打成的包运行时肯定就会报错。
provided范围依赖:开发时,由于没有运行时环境,有些jar我们需要暂时依赖(不依赖有些方法就会找不到,用不了),但是项目打包部署运行时,由于运行时环境(servlet容器,比如:tomcat)会提供一些jar包,所以开发时那些暂时依赖的jar包就不能参与打包了,否则会发生冲突导致报错。
optional:不会依赖传递jar的引用,用法如下:
例如
- B依赖了日志框架
logback、log4j、apache commons log
- 这时候的依赖关系如下 A->B
因为maven有依赖传递机制.那么A项目就会有3个jar包,logback、log4j
、apache commons log
.实际上我们一般只会在项目中使用一种日志框架.那么我们项目中就会有多余的依赖.当这种情况时越来越多时,最后整个项目的jar包就有很多的多余依赖,导致项目很臃肿.
如何优化
只要B项目中把logback、log4j、apache commons log
设置成<optional>true</optional>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<optional>true</optional>
</dependency>
ps:我在工作之余还能坚持写博客,这在很大程度上面要感谢我的小宝贝:文。