[1117]maven依赖中scope=compile和provided区别

2023-10-31

scope的其他参数如下

  • compile

默认的scope,表示dependency(依赖)都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布

  • provided

跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。

  • runtime

表示dependency不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段。 test表示dependency作用在测试时,不作用在运行时。 只在测试时使用,用于编译和运行测试代码。不会随项目发布。 system跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它

解释:

对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中。

而对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。换句话说,它只影响到编译,测试阶段。在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,而在运行阶段,假定目标的容器(比如我们这里的liferay容器)已经提供了这个jar包,所以无需我们这个artifact对应的jar包了。

听起来很玄乎,对吧,其实一点也不难理解。举个scope=provided的例子。

比如说,假定我们自己的项目ProjectABC 中有一个类叫C1,而这个C1中会import这个portal-impl的artifact中的类B1,那么在编译阶段,我们肯定需要这个B1,否则C1通不过编译,因为我们的scope设置为provided了,所以编译阶段起作用,所以C1正确的通过了编译。测试阶段类似,故忽略。

那么最后我们要吧ProjectABC部署到Liferay服务器上了,这时候,我们到$liferay-tomcat-home\webapps\ROOT\WEB-INF\lib下发现,里面已经有了一个portal-impl.jar了,换句话说,容器已经提供了这个artifact对应的jar,所以,我们在运行阶段,这个C1类直接可以用容器提供的portal-impl.jar中的B1类,而不会出任何问题。

实际插件的行为:

刚才我们讲述的是理论部分,现在我们看下,实际插件在运行时候,是如何来区别对待scope=compile和scope=provided的情况的。

做一个实验就可以很容易发现,当我们用maven install生成最终的构件包ProjectABC.war后,在其下的WEB-INF/lib中,会包含我们被标注为scope=compile的构件的jar包,而不会包含我们被标注为scope=provided的构件的jar包。这也避免了此类构件当部署到目标容器后产生包依赖冲突。

今天开发web的时候,需要用到servlet-api,于是在pom.xml中添加依赖

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>3.0-alpha-1</version>
 </dependency>

通过插件启动tomcat的时候,报错,里面有一段是这样的:

Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catalina/loader/WebappClassLoader) previously initiated loading for a different type with name "javax/servlet/ServletContext"
 at java.lang.ClassLoader.defineClass1(Native Method)
 at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
 at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
 at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
 at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
 at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

产生的原因是:tomcat中也有servlet-api包,这样,发生了冲突

解决方法:添加provided,因为provided表明该包只在编译和测试的时候用,所以,当启动tomcat的时候,就不会冲突了,完整依赖如下:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>3.0-alpha-1</version>
  <scope>provided</scope>
 </dependency>

参考:https://www.jb51.net/article/190965.htm
https://blog.51cto.com/supercharles888/981316

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[1117]maven依赖中scope=compile和provided区别 的相关文章

随机推荐

  • HDU6703 Fishing Master

    比赛的时候想的是尽量先炖鱼 果然还是赛后牛逼 反应过来无论怎样总时间内一定有所有的炖鱼时间 所以只需要尽量缩减我们的钓鱼时间即可 一 在炖鱼时间内可以把所有鱼都钓上来 那ans k t 1 n 二 不能在炖鱼时间内把所有鱼都钓上来 即每次钓
  • 小学生学Arduino---------点阵(三)动态的显示与清除

    学习目标 1 理解 整数值 的概念与使用 2 理解 N 1 指令的意义 3 掌握 反复执行多次 指令的使用 4 掌握屏幕模块的清除功能指令 5 理解 反复执行 指令与 反复执行多次 指令的嵌套使用 6 搭建电路图 7 编写程序 效果 整数包
  • 物联网LoRa系列-7:LoRa终端模组ASR6505详解

    1 ASR6505简介 在2018年 Semtech公司推出了在综合性能上优于SX1278 SX1276射频收发器的SX1268 SX1262射频收发器 各大厂商也纷纷开始根据新的射频收发器来升级方案 意在取代性能无法适应市场的SX1278
  • stm32f103串口接收队列,DMA循环模式+空闲中断

    串口通讯最主要的就是要不丢数据 不丢帧 基本设想就是建立一个大的串口缓冲区 串口接收到的数据使用循环队列的方式全部往这个缓冲区放 不过这种方式需要把串口缓冲区弄大一点 防止数据覆盖 在stm32中 利用DMA 空闲中断很容易做到这一点 只需
  • Iterm2使用指南

    Iterm2使用指南 1 安装iterm2 官网直接下载安装 官网 2 个性化设置 iterm2 gt preferences gt profiles 点击新建一个profile 下面可以设置透明度 模糊度 背景图片 设置窗口的主题配色 下
  • jlpt报名系统显示网络错误和服务器忙,【JLPT】12月日语等级考试报名经验与技巧...

    2017年12月日语能力考 JLPT 报名日期即将到来 N1考试 8月28日 N2考试 8月29日 其他级别考试 8月31日 这次日语考试报名的 抢椅子 大战即将展开 为了能够顺利地抢到考位 未名天日语小编还是建议大家提前做好一切报名前的准
  • CSDN-markdown编辑器指导文件

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • SpringBoot+Vue+Uniapp搭建的Java版本的ChatGPT智能Ai对话系统

    chatgpt java system 介绍 SpringBoot Vue Uniapp搭建的Java版本的ChatGPT智能Ai对话系统 小程序和H5包含智能Ai对话 精美Ai壁纸 知识付费商城 积分 会员 分享等公功能 后端管理包括系统
  • 虚拟存储器

    文章目录 虚拟存储器 一 虚拟存储器概述 二 页式虚拟存储器 例题分析 三 段式与段页式虚拟存储器 虚拟存储器 一 虚拟存储器概述 1 引入原因 高速的主存容量满足不了要求 虚拟存储器 在操作系统及辅助硬件的管理下 由主存和大容量外存所构成
  • R语言入门——笔记(二)--包(package)的使用及RStudio的使用,加载包和数据集

    一 1 包 package 的使用 包是扩展R基本功能的机制 集成了众多函数 如果想使用某些函数而当前R中不存在 就可以找对应函数的包直接使用 去哪里找包 如何使用包 CRAN install packages Bioconductor G
  • unity3d GUI.Button 自定义字体大小及透明背景

    代码 public class MyButton MonoBehaviour public Texture buttonTexture Use this for initialization void Start Update is cal
  • 【通信原理课设--基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真】课程设计报告大纲

    1 摘要 研究现状 对本设计模型的介绍 2 目录 自动生成即可 3 概述 3 1 课程设计背景 该设计的应用现状 针对应用部分 3 2 国内外研究背景 对该设计的研究状况 针对学术研究 3 3 报告组织形式 介绍本报告的框架结构 4 系统模
  • python图像处理Pillow学习笔记

    Pillow学习笔记 1 安装pillow pip install pillow 2 图像处理简介 图像处理RGB色彩模式 R red 0 255 G green 0 255 B blue 0 255 像素阵列 每个点就是一个像素每个点都由
  • Spring Cloud Alibaba之负载均衡组件 - Ribbon

    负载均衡 我们都知道在微服务架构中 微服务之间总是需要互相调用 以此来实现一些组合业务的需求 例如组装订单详情数据 由于订单详情里有用户信息 所以订单服务就得调用用户服务来获取用户信息 要实现远程调用就需要发送网络请求 而每个微服务都可能会
  • 疫情期间,这1家庭常备药品清单你要收藏好,4个囤药误区要避免

    疫情期间 这1家庭常备药品清单你要收藏好 4个囤药误区要避免 2022 12 06 16 30 疫情期间 这1家庭常备药品清单你要收藏好 4个囤药误区要避免 疫情常态化管理 很多人开启了 囤药 模式 有不少人感慨 像逛超市一样逛药店 像囤菜
  • linux中用top、ps命令查看进程中的线程

    在Linux上显示某个进程的线程的几种方式 方法一 PS 在ps命令中 T 选项可以开启线程查看 下面的命令列出了由进程号为
  • Spring Cloud技术分析(3)- spring cloud sleuth

    spring cloud sleuth是从google的dapper论文的思想实现的 提供了对spring cloud系列的链路追踪 本文主要从spring cloud sleuth的使用着手 上一篇 Spring Cloud技术分析 2
  • JS数组

    数组的对象是Array 1 length属性 获取字符串的长度 2 一维数组 1 2 3 4 5 5 二维数组 1 2 4 4 5 5 6 7 7 8 var arr 1 2 4 4 5 5 6 7 7 8 console log arr
  • WIN7-L2TP/IPSec 访问网站连接被重置-错误809的解决办法

    开始以为是VPS上服务配置的问题 但是移动设备是连接OK的 所以问题就推到win7系统配置的问题了 因为之前做过优化 所以考虑应该是服务的问题 L2TP属于加密的VPN的一种协议 最初win7是连上之后不能访问 非死不可 国内的可以访问 后
  • [1117]maven依赖中scope=compile和provided区别

    scope的其他参数如下 compile 默认的scope 表示dependency 依赖 都可以在生命周期中使用 而且 这些dependencies 会传递到依赖的项目中 适用于所有阶段 会随着项目一起发布 provided 跟compi