关于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 企业级应用包

实践建议:

  1. 大多数情况不需要指定 type:让 Maven 使用默认值 jar

  2. 只有特殊情况才指定:

    • BOM 依赖管理:type=pom

    • 特殊的打包格式:type=wartype=ear 等

  3. 保持一致性:同一项目的依赖尽量统一类型

 

  • 默认值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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

--

posted on 2026-01-06 22:36  有点懒惰的大青年  阅读(70)  评论(0)    收藏  举报