maven optional 和 maven scope

一、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包。

猜你喜欢

转载自blog.csdn.net/weixin_44606481/article/details/132700574