Maven的scope详解

文章目录

  • 依赖范围介绍
    • compile
    • test
    • provided
    • runtime
    • system
    • import
  • 依赖传递
  • 依赖范围与 classpath 的关系表
  • 参考

依赖范围介绍

maven 项目不同的阶段引入到classpath中的依赖是不同的,例如,编译时,maven 会将与编译相关的依赖引入classpath中,测试时,maven会将测试相关的的依赖引入到classpath中,运行时,maven会将与运行相关的依赖引入classpath中。依赖范围就是用来控制依赖与三种classpath(编译classpath、测试classpath、运行classpath)的关系。 依赖范围更为通俗的理解,其实就是给依赖包打标记,例如将 A 依赖包标记为“compile”,Maven 就知道 A 依赖包在项目编译的时候要被引入到 classpath 中。

依赖范围必须在 pom.xml 文件中的 <scope> 标签中设定,如下所示:

 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.7</version><scope>test</scope>
</dependency>

上述 <scope> 标签就是用来指定被依赖资源的依赖范围,可选配置有 compile、test、provided、runtime、system、import,若不指定则默认 compile。

在 pom.xml 中设定好后,你需要点击“Load Maven Changes” 才会生效。

在这里插入图片描述
比方说,你修改了标签 <scope> 的取值,你需要 Load Maven Changes,在模块的依赖管理中才会出现新的取值,如下所示:
在这里插入图片描述

你如果只是在上述依赖管理的界面中改变 scope 的取值是没有效果的,只能通过 pom.xml 中的 scope 标签来设定。

说明:
1.编译是指将整个项目(其实是模块)的 src/main/java 目录下的源代码文件以及 resources 目录下的资源文件编译输出到 classes 目录下。在这个编译过程中编译器会到 classpath 指定的目录下查找字节码文件(jar包、class文件等)
2.测试是指编译测试的代码和运行测试的代码,通常使用 Junit 工具进行代码的测试
3.运行是指项目部署到服务器,并且启动了服务器,客户端可以正常访问应用

compile

编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven 依赖,对于编译、测试、运行三种classpath 都有效。典型的例子是spring-core,在编译、测试和运行的时候都需要使用该依赖。

既然运行时也要使用 scope 设为 compile 的依赖,所以 scope 为 compile 的依赖在项目打部署包的时候(即构建 artifact)会被一起打包,会放在 WEB-INF/lib 目录下。

test

测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子是JUnit,它只有在编译测试代码及运行测试的时候才需要。

scope 为 test 的依赖只在测试时使用,用于编译和运行测试代码,不会参与项目的打包。

provided

已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效(对运行的classpath无效)。典型的例子是 servlet-api, 编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引人一遍。既然运行时容器会提供,所以 scope 为 provided 的依赖不会参与项目的打包。

runtime

运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行class-path有效,但在编译主代码时无效(对编译的classpath无效)。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。

既然运行时也要使用 scope 设为 runtime 的依赖,所以 scope 为 runtime 的依赖在项目打部署包的时候(即构建 artifact)会被一起打包,会放在 WEB-INF/lib 目录下。

system

系统依赖范围。该依赖与三种 classpath 的关系,和 provided 依赖范围完全一致。但是,system 范围的依赖不会从 maven 仓库下载,而是从本地文件系统获取,使用 system 范围的依赖时必须通过 <systemPath> 元素显式地指定依赖文件的路径。

由于此类依赖不是通过 Maven 仓库解析的,而且往往与本机系统绑定,可能造成构建(构建的产物有:classes和artifact)的不可移植,因此应该谨慎使用。

元素 <systemPath> 可以引用环境变量,如下:

<dependency><groupId>javax.sql</groupId><artifactId>jdbc-stext</artifactId><version>2.0</version><scope>system</scope><systemPath>${java.home}/lib/rt.jar</systemPath> 
</dependency>

import

导入依赖范围,该依赖范围不会对三种 classpath 产生影响,该依赖范围只能与 <dependencyManagement> 元素配合使用,其功能为将目标pom.xml 文件中元素 <dependencyManagement> 的配置导入合并到当前 pom.xml 文件的元素 <dependencyManagement> 中。有关元素 <dependencyManagement> 的功能请了解 Maven 继承特性。

依赖传递

什么是依赖传递?

就是假设你有一个 Maven 项目叫 A,你在这个项目中添加了一个依赖,这个依赖是你的另一个 Maven 项目 B,你在这个被依赖的项目 B 中添加一些依赖,这些依赖也会自动地添加到 A 中,这就是依赖传递。简单来说就是项目的依赖的依赖也会成为该项目的依赖。

<scope> 标签的取值对依赖传递有什么影响呢?

这个影响就是,只有当依赖的 scope 标签被定义为 compile 时才会发生依赖传递,而定义为 test 或者 provided 都不会发生依赖传递。

依赖范围与 classpath 的关系表

在这里插入图片描述

参考

https://www.pianshen.com/article/90681857024/
https://www.liaoxuefeng.com/wiki/1252599548343744/1309301178105890
https://www.cnblogs.com/sanshisiniao/articles/12068847.html
https://www.cnblogs.com/tuyang1129/p/10741558.html
https://blog.csdn.net/seasonsbin/article/details/79093647
https://blog.csdn.net/lishuoboy/article/details/100554751

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下编译与运行,Linux操作系统驱动编译与运行是怎样的?

一、手工加载测试1、insmod 。/key_test。ko 加载驱动模块到内核2、cat /proc/modules |grep key_test 查看key_test模块在内核中的地址&#xff0c;不加过滤器可以看到全部加载的模块。3、lsmod 显示模块&#xff0c;这时可以看到所有的模块名字&#xff0c;后面跟的是主设备号…

spring mvc 提示_Spring BootHibernate提示

spring mvc 提示1.概述 Hibernate无需介绍。 它是Java中最受欢迎的ORM。 同样&#xff0c;Spring Boot是Java中功能最强大&#xff0c;最易于使用的框架。 本教程与Hibernate或Spring Boot无关&#xff0c;其中有大量的内容。 我们将研究在将它们一起使用时可能会遇到的一些…

异常:Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

执行 JDBC 有关代码时&#xff0c;报如下的异常&#xff1a; 原来是配置文件的内容有问题&#xff1a;

linux 端口tnpl,利用Python找出9个连续的空闲端口

这篇文章主要介绍了Python找出9个连续的空闲端口的方法&#xff0c;感兴趣的小伙伴们可以参考一下一、项目需求安装某软件&#xff0c;配置时候需要填写空闲的端口。查看5个平台的某个端口是否被占用5个平台为windows, linux, aix, hp, solaris二、实现方案有两种1、利用 pytho…

go比java快多少_Java 11快多少?

go比java快多少尽管大多数开发人员仍然使用Java 8 &#xff0c;但Java 11还是在不久前发布的。 让我们看看其中哪个对OptaPlanner更快。 找出答案的最佳方法当然是运行OptaPlanner基准测试。 本文是我们针对Java 8的类似文章的后续文章 。 基准方法 为了运行基准测试&#xff…

部署项目,所谓“部署”到底是在干什么?

第一步&#xff1a;把项目部署包放在服务器指定目录&#xff08;webapps&#xff09;下&#xff0c;让服务器可以找到项目资源&#xff1b;或者通过配置文件让服务器可以找到项目资源。 第二步&#xff1a;把项目的访问路径、资源映射等数据加载进内存中&#xff0c;这样客户端…

linux查看文件使用情况,linux查看文件句柄使用情况

Linux 3.2.0-23-generic (linux) 09/08/2014 _x86_64_ (8 CPU)02:01:55 PM dentunusd file-nr inode-nr pty-nr02:02:05 PM 38465 1568 25731 402:02:15 PM 38465 1568 25728 402:02:25 PM 38465 1536 25723 4Average: 38465 1557 25727 4输出项说明&#xff1a;kbmemfree&…

Update resources 和 Update classes and resources 的特殊情况

resources目录的文件删除了&#xff0c;不会更新部署包中的相关文件&#xff1b;但是会更新编译输出目录下的相关文件&#xff08;在 run 和 debug 模式下&#xff09; webapp 目录的文件删除了&#xff0c;不会更新部署包中的相关文件&#xff08;在 run 和 debug 模式下&…

java堆内与堆外数据交互_Java:汇总堆外数据

java堆内与堆外数据交互探索如何以最小的垃圾回收影响和最大的内存利用率创建堆​​外聚合。 使用Java Map&#xff0c;List和Object创建大型聚合通常会产生大量堆内存开销。 这也意味着&#xff0c;一旦聚合超出范围&#xff0c;垃圾收集器将必须清理这些对象。 阅读这篇简短…

linux内核cpu负载计算,CPU 负载 — The Linux Kernel documentation

CPU 负载Linux通过/proc/stat和/proc/uptime导出各种信息&#xff0c;用户空间工具如top(1)使用这些信息计算系统花费在某个特定状态的平均时间。例如&#xff1a;$ iostatLinux 2.6.18.3-exp (linmac) 02/20/2007avg-cpu: %user %nice %system %iowait %steal %idle10.01 0.00…

IntelliJ IDEA 中的Java Web项目的资源文件复制新增如何更新到部署包中?

文章目录resources目录下的文件复制新增webapp目录的文件复制新增IntelliJ IDEA 中的Java Web项目的资源文件如果复制新增&#xff0c;正常的重新部署、重启服务器、update resources&#xff0c;并不会更新到部署包中&#xff0c;必须要特殊处理才行。 resources目录下的文件…

apache.camel_Apache Camel 2.23发布

apache.camel昨天发布了Apache Camel 2.23 &#xff0c;其中最值得注意的新功能是对Spring Boot 2.1的支持&#xff0c;我们还改进了启动器组件以包括更多的元数据&#xff0c;并对改进的Spring Boot自动配置进行了优化。 此版本主要是一个大的错误修复版本和一些其他小的新增…

在linux上安装mysql5.6,在linux(Centos 7以上版本亲测)上安装mysql5.6

./scripts/mysql_install_db --usermysql --datadir/usr/local/mysql/data/mysql如果执行报错[rootdc1atmpapp12 mysql]# ./scripts/mysql_install_db --usermysql --datadir/usr/local/mysql/data/mysql FATAL ERROR: please install the following Perl modules before execu…

NewServlet ‘***Servlet‘ already exists inthis Web facet.

使用模板创建了一个 Servlet&#xff0c;创建 Servlet 时没有勾选“Create Java EE 6 annotated class”&#xff0c;再把该 Servlet 删除掉&#xff0c;再创建同名的 Servlet&#xff0c;IDEA 就会报错&#xff1a;NewServlet ‘***Servlet’ already exists in this Web face…

payara 创建 集群_Apache Payara:让我们加密

payara 创建 集群前一段时间&#xff0c;我写了一个小教程 &#xff0c;介绍如何生成“让我们加密SSL”证书并将其安装在Glassfish Java EE平台上。 这个技巧对我来说是一个奇迹&#xff0c;但是每三个月必须手动更新和重新安装证书变得很烦人。 我做了一些研究&#xff0c;并…

腾讯为什么不开发linux软件下载,你认为国产操作系统如何搭建生态?为什么腾讯不给Linux系统适配QQ?...

Linux的软件少主要是&#xff0c;十几二十年前&#xff0c;要在Linux上开发软件&#xff0c;要遵循开源协议&#xff0c;也就意味着你在上面开发个的公开应用都得开源&#xff0c;至少得公开一部分&#xff0c;所以很多商业闭源应用都绕过了Linux。现在随着Linux的分支越来越多…

Download Apache Commons BeanUtils

下载地址&#xff1a;https://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi

stripe pay_J2Pay –实施网关

stripe pay介绍 如果您使用任何网关&#xff0c;您都可以在我们的库中实现该网关并支持开源世界&#xff0c;我们将非常高兴地欢迎贡献者。 您可以在这里找到我们的github存储库 在开始实现网关之前&#xff0c;您应该首先看到其他一些类。 以下是简要定义的类。 HTTP客户端…

linux l文件共享,llinux服务器文件共享的一种简单的方法

如果Centos虚拟机没有安装文件共享功能&#xff0c;那么客户端与服务器文件共享会产生一些困扰&#xff1b;这里有一个小的方法&#xff0c;可以快速实现linux服务器与windows共享&#xff1b;这里以CentOS 6.4 版本为例&#xff1b;通过xshell链接到服务器上&#xff1b;要在l…

BeanUtils的学习

BeanUtils 用于将数据封装成 JavaBean。 什么是 JavaBean 一种标准的 Java 类 要求&#xff1a; 1.类必须被public修饰 2.必须提供空参的构造器 3.成员变量必须使用private修饰 4.提供公共setter和getter方法 功能&#xff1a; JavaBean用于封装数据 主要的方法 popular&a…