maven的scope详解

server/2024/12/26 16:06:57/

Maven 的 scope(作用域)用于定义依赖项在构建生命周期中的可见性和使用范围。正确设置依赖项的作用域可以帮助优化构建过程,减少不必要的依赖,并确保项目在不同环境中(如编译、测试、运行时)能够正确工作。以下是 Maven 中常见的几种 scope 及其详细解释:

1. compile(默认)

  • 描述:如果未指定 scope,则默认为 compile
  • 影响:
    • 该依赖项对所有类路径(编译、测试和运行时)都可用。
    • 它会被打包到最终的 JAR 或 WAR 文件中。
    • 适用于大多数普通库依赖。
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>compile</scope>
</dependency>

2. provided

  • 描述:表示依赖项由 JDK 或容器提供。
  • 影响:
    • 编译和测试时可用,但不会被打包到最终的 JAR 或 WAR 文件中。
    • 常见于 Servlet API、JSP API 等 Web 应用程序的依赖项,因为这些 API 在运行时由应用服务器提供。
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>

3. runtime

  • 描述:表示依赖项仅在运行时需要,在编译时不需要。
  • 影响:
    • 编译时不使用,但在运行时和测试时可用。
    • 不会被包含在编译类路径中,但会被包含在运行时类路径中。
    • 适用于 JDBC 驱动程序等。
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version><scope>runtime</scope>
</dependency>

4. test

  • 描述:表示依赖项仅在测试编译和执行阶段使用。
  • 影响:
    • 编译主代码时不可用,但在测试编译和运行测试时可用。
    • 不会被打包到最终的 JAR 或 WAR 文件中。
    • 适用于单元测试框架如 JUnit、Mockito 等。
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>

5. system

  • 描述:类似于 provided,但依赖项不是从远程仓库获取,而是从本地文件系统加载。
  • 影响:
    • 必须通过 <systemPath> 明确指定本地路径。
    • 使用较少,通常不推荐,因为它违反了 Maven 的依赖管理原则(即依赖应该来自远程仓库)。
<dependency><groupId>javax.sql</groupId><artifactId>jdbc-stdext</artifactId><version>2.0</version><scope>system</scope><systemPath>${project.basedir}/lib/jdbc-stdext.jar</systemPath>
</dependency>

6. import (仅限于 <dependencyManagement>)

  • 描述:仅在 <dependencyManagement> 元素中使用,用于导入其他 POM 文件中的依赖管理配置。
  • 影响:
    • 允许在一个项目中引入另一个项目的依赖管理部分,而不引入实际依赖。
    • 有助于集中管理和共享依赖版本。
<dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>example-dependencies</artifactId><version>1.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

总结

选择正确的 scope 对于构建效率和项目的可维护性至关重要。理解每个 scope 的具体用途可以帮助您更好地组织和管理项目的依赖关系。


http://www.ppmy.cn/server/153366.html

相关文章

常用类晨考day15

1.基本数据类型以及对应包装类 Byte Short Integer Long Float Double Boolean Character 2.什么是自动拆箱和装箱&#xff0c;jdk版本有什么要求&#xff1f;代码举 例并标明 Integer a 100; // 装箱 int b a; // 拆箱 从JDK1.5才开始支持 3.NumberFormatException是什么异常…

workman服务端开发模式-应用开发-后端api推送修改一

一、修改后端api登录 在根目录下app文件夹下controller文件夹下common文件夹下Login.php文件下&#xff0c;修改doLogin方法&#xff0c;代码如下&#xff1a; //登录public function doLogin(){$param $this->request->param();$validate new \app\validate\common\L…

HarmonyOS NEXT 实战之元服务:静态案例效果---最近播放音乐

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; Index import { authentica…

TCP/IP 邮件

TCP/IP邮件是互联网通信中非常重要的应用之一。当我们发送电子邮件时&#xff0c;我们实际上并没有直接使用TCP/IP协议&#xff0c;而是通过电子邮件程序&#xff0c;例如微软的Outlook、莲花软件的Notes或Netscape Communicator等来实现。这些电子邮件程序背后使用了不同的TCP…

MFC小知识:CEdit::GetSel函数的使用

CEdit::GetSel函数是CEdit类的成员函数&#xff0c;它的功能是返回编辑框中光标选中区域的开始和结束位置&#xff0c;如果没有选取区域&#xff0c;则返回的就是光标位置&#xff08;开始与结束位置相同&#xff09;。这个函数可以通过CEdit类对象或对象指针调用&#xff0c;它…

谈谈JSON

中文名&#xff1a;JS键值对数据 英文名&#xff1a;JavaScript Object Notation JSON是一种常用的数据格式&#xff0c;其简洁和清晰的层次结构有效地提升了网络传输效率&#xff0c;很多编程语言都支持JSON格式的数据交换。 JSON 相比于 XML 来说&#xff0c;更小、…

一些基础面试题

重写和重载的区别&#xff1a; 方法的重载和重写都是实现多态的方式&#xff0c;区别在于前者实现的是编译时的多态性&#xff0c;而后者实现的是运行时的多态性。重载发生在一个类中&#xff0c;同名的方法如果有不同的参数列表&#xff08;参数类型不同、参数个数不同或者二…

Bayes-GRU-Attention的数据多特征分类预测Matlab实现

Bayes-GRU-Attention的数据多特征分类预测Matlab实现 目录 Bayes-GRU-Attention的数据多特征分类预测Matlab实现分类效果基本描述程序设计参考资料 分类效果 基本描述 Bayes-GRU-Attention的数据多特征分类预测Matlab实现 MatLab贝叶斯(BO)基于-GRU-注意的数据多特征分类预测(…