pom scope标签的作用
在 Maven 中,dependency 元素用于指定项目所依赖的库或模块。其中,scope 标签用于控制依赖的范围,即指定依赖的有效范围,以便在不同的环境下进行不同的构建或部署。scope 标签有以下可选项:
- compile:依赖在编译、测试和运行时都可用(默认值)。
- provided:依赖在编译和测试时可用,但在运行时由运行环境提供。
- runtime:依赖在测试和运行时可用,但在编译时不需要。
- test:依赖只在测试时可用。
- system:类似 provided,但需要显式地指定依赖的路径或文件。
- import:该 scope 只用于在 pom.xml 中使用 dependencyManagement 元素来管理依赖版本号,不会实际被引入到项目中。
煮个栗子
provided用法
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
通常情况下,lombok 依赖的 scope 被定义为 provided。这是因为 lombok 库在编译时需要在 classpath 中存在,但在运行时不需要被打包到部署包中,因为它只是一个编译时工具库。因此,将其设置为 provided 可以避免将不必要的 jar 包打包到部署包中,从而减小部署包的大小。同时,在使用 lombok 时,需要将其添加到 IDE 或编译器的插件中,以确保在编译时正常使用 lombok 注解。
import用法
Maven 的 dependencyManagement 元素用于管理项目的依赖版本号,它可以集中管理项目的依赖版本号,避免在多个模块中重复声明版本号,同时方便版本的统一升级。如某版本的
spring-boot-starter-parent:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.12</version>
</dependency>
</dependencies>
</dependencyManagement>
自己的项目在使用spring-boot-starter-parent作为parent,同时在需要使用这些依赖的子模块中,不需要再指定依赖的版本号,只需要声明对应的 groupId 和 artifactId。例如:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
</dependencies>
这样,子模块会自动使用父 POM 中声明的版本号来获取依赖。如果需要升级依赖的版本,只需要在父 POM 中修改对应的版本号即可,所有子模块都会自动继承这个版本号。
注意,dependencyManagement 只是用于管理依赖版本号,它并不会引入实际的依赖。如果需要在子模块中引入依赖,还需要在 dependencies 元素中声明具体的依赖信息。
如果子模块的作用于是import:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<scope>import</scope>
</dependency>
</dependencies>
由于 scope 被设置为 import,这些依赖也不会被实际引入到子模块中,而是只用于管理版本号。