一、maven optional
1、optional是什么
optional是是用来控制 Maven依赖 jar 时的一个选项,表示该依赖是否要被传递,当optional设置为true时代表不会传递给依赖者,当为false时代表可以传递给依赖着,默认为false。
<optional>true</optional>
2、为什么使用optional
- 减少不必要的依赖传递
- 减少jar包冲突
3、使用业务场景
假设我们现在在写一个工具包my-common,这个工具包会引入一个guava包,那么我们其它项目在引入my-common包时也会将guava包引入。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.0-jre</version>
</dependency>
因为maven有依赖传递机制,那么其它项目就会有guava的jar包,实际上我们其它项目并不需要guava包,那么我们项目中就会有多余的依赖,当这种情况时越来越多时,最后整个项目的jar包就有很多的多余依赖,导致项目很臃肿。此时可以设置optional为true就不会传递给其它项目。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.0-jre</version>
<optional>true</optional>
</dependency>
一、maven scope
1、scope是什么
scope元素的作用:控制 dependency 元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用,默认是compile被依赖项目需要参与到当前项目的编译,测试,打包,运行等阶段。
<scope>compile</scope>
2、scope可选值
- compile:默认值。表示被依赖项目需要参与当前项目的编译、测试、打包、运行,是一个比较强的依赖。
- test:依赖项目仅仅参与测试相关的工作。包括测试代码的编译和执行,不会被打包,例如:junit。
- runtime:表示被依赖项目无需参与项目的编译,只参与后期的测试、打包、运行。与compile相比,跳过了编译。例如JDBC驱动,适用运行和测试阶段。
- provided:理论上可以参与编译,测试等周期,但不被打包,也不会参与运行,因为其他的依赖会提供。相比于compile,打包阶段做了exclude操作。
- system:和provided相同。不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径。一般用于引用外部Jar包。