关于maven中标签的说明
1.dependency下面的type和scope的意思是什么?
比如在父项目中有这么一段配置:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在 Maven 的 <dependency> 元素中,type 属性的默认值是 jar。
常见的type值:
| type 值 | 说明 | 使用场景 |
|---|---|---|
| jar (默认) | Java ARchive 文件 | 大多数 Java 依赖 |
| pom | Project Object Model | 依赖管理(BOM) |
| war | Web Application ARchive | Web 应用包 |
| test-jar | 测试专用的 jar | 只用于测试的依赖 |
| maven-plugin | Maven 插件 | Maven 插件依赖 |
| ejb | Enterprise JavaBean | EJB 模块 |
| ear | Enterprise ARchive | 企业级应用包 |
实践建议:
-
大多数情况不需要指定 type:让 Maven 使用默认值
jar -
只有特殊情况才指定:
-
BOM 依赖管理:
type=pom -
特殊的打包格式:
type=war,type=ear等
-
-
保持一致性:同一项目的依赖尽量统一类型
-
默认值:
type="jar" -
常见值:
jar(大多数依赖),pom(BOM依赖管理) -
原则:普通 Java 依赖不指定 type,依赖管理包必须指定
type=pom
scope=import 的含义
作用:导入 BOM(Bill Of Materials)
scope=import 表示将这个依赖的 依赖管理信息 导入到当前项目的依赖管理中。
import 的工作流程
1. 你的项目声明 scope=import
2. Maven 下载 BOM 文件
3. 将 BOM 中的 <dependencyManagement> 内容合并到你的项目中
4. 你的依赖自动使用 BOM 中定义的版本
其他 scope 值对比
| scope 值 | 含义 | 使用场景 |
|---|---|---|
| import | 导入依赖管理信息 | 仅在 <dependencyManagement> 中用于 BOM |
| compile | 编译范围(默认) | 编译、测试、运行都需要 |
| provided | 已提供范围 | 容器或 JDK 已提供,如 servlet-api |
| runtime | 运行时范围 | 仅运行时需要,如 JDBC 驱动 |
| test | 测试范围 | 仅测试时需要,如 junit。 |
| system | 系统范围 | 从本地系统路径引入 |
classpath 分为三种:编译classpath , 测试classpath , 运行classpath
Scope 选项如下:
Compile:编译依赖范围。默认就是compile。在编译,测试,运行都有效;
Test:测试依赖范围。仅测试有效; 例如JUnit;
Provided:已提供依赖范围。编译,测试有效,运行时候无效。例如servlet-api。
System:系统依赖范围。(了解即可)使用system 范围的依赖必须通过sytemPath 指定依赖文件的路径。
Import:导入依赖范围。(了解即可)使用dependencyManagement 时候,可以导入依赖配置。
编译classpath,测试classpath,运行classpath,就看编译、测试、运行的时候是不是加载这个jar;
Scope:
- provided: 例如servlet-api,什么意思?比如我们把user-web打包(maven install),查看这个war包,发现web-inf/classes下面也有servle-api这个jar包,但是是不需要的,发布到tomat里面,tomcat的lib下面本身就有了servlet-api了;还有Lombok通常只需要在编译时使用,所以最佳实践是将其
scope设置为provided - test:表示该依赖仅在测试代码(
src/test/java)中有效,在正式的业务代码(src/main/java)中不可用。打包后的 JAR/WAR(生产环境)中jar不会被打进去。这样做的目的是:测试依赖只在开发阶段需要,运行时不需要,从而减小最终产物的体积。常见例子:JUnit,在src/test/java中写@Test注解没问题,在src/main/java中写@Test会编译报错(找不到类)。总结:<scope>test</scope>= “这个依赖只在写单元测试时用,编译打包到生产环境时请自动忽略我。”
总结
-
scope=import是专门用于导入 BOM 依赖管理信息的 -
不能省略:在
<dependencyManagement>中对于type=pom的依赖必须使用 -
作用:让项目继承 BOM 中定义的所有依赖版本
-
位置:只能在
<dependencyManagement>中使用
scope为system时可以用来maven加载本地jar:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>opensdk-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- 这里是私服地址,需要替换一下成自己的或者加载本地jar -->
<!-- <dependency>-->
<!-- <groupId>com.wanxin.leasing</groupId>-->
<!-- <artifactId>open-sdk</artifactId>-->
<!-- <version>1.0.1</version>-->
<!-- </dependency>-->
<!-- 加载本地jar -->
<dependency>
<groupId>com.wanxin.leasing</groupId>
<artifactId>open-sdk</artifactId>
<version>1.0.4</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/wx-java-sdk-1.0.4.jar</systemPath>
</dependency>
</dependencies>
</project>
--
浙公网安备 33010602011771号