maven中scope=compile 和 provided区别

maven中scope=compile 和 provided区别问题再现 上次这边朋友问我一个问题 就是他们在 pom xml 中的 dependency 中 看到有一些是 lt scope gt provided lt scope gt 的情况 比如如下 lt dependency gt nbsp nbsp nbsp nbsp lt groupId gt com liferay portal lt groupId gt nbsp nbsp nbsp nbsp lt artifactId gt portal impl amp l

问题再现:

上次这边朋友问我一个问题,就是他们在pom.xml中的dependency中,看到有一些是

provided
的情况,比如如下:


  1. <dependency> 
  2.    <groupId>com.liferay.portal
    groupId> 
  3.    <artifactId>portal-impl
    artifactId> 
  4.    <version>6.1.0
    version> 
  5.    <scope>provided
    scope> 

  6. dependency> 

他们问我scope在何种情况下要设置为provided,以及和scope设置为compile的区别。

 

解释:

其实这个问题很简单。

对于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包。这也避免了此类构件当部署到目标容器后产生包依赖冲突。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227016.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:08
下一篇 2026年3月16日 下午10:08


相关推荐

  • IPv6/IPv4 + aliddns 实现黑群晖外网控制和访问

    IPv6/IPv4 + aliddns 实现黑群晖外网控制和访问前言一直想弄台黑群NAS,但因为穷!一直没入,一直用的是玩客云,但玩客云满足不了我的需求,但正好搭上蜗牛星际的车!J1900+4G内存+16G固态+4盘位+千兆网口才380元,性价比是真的高,再买两个二手的2T机械硬盘(一个做备份盘),还有一个自己的500G机械硬盘,目前完全够用。目前主流内网穿透方案目前内网穿透有如下几种方案frp、ngrok等转发工具,需要一个有公网ip的服务器,…

    2022年6月7日
    73
  • java 判断一个对象是否为空对象

    java 判断一个对象是否为空对象最近项目中遇到一个问题,在用户没填数据的时候,我们需要接收从前端传过来的对象为null,但是前端说他们一个一个判断特别麻烦,只能传个空对象过来,我第一个想法就是可以通过反射来判断对象是否为空。第一版:User.javapublicclassUser{privateStringusername;privateBooleanactive;priva…

    2022年6月5日
    40
  • SQL server 自定义函数FUNCTION的使用

    SQL server 自定义函数FUNCTION的使用前言 在 SQLserver 中不仅可以可以使用系统自带的函数 时间函数 聚合函数 字符串函数等等 还可以根据需要自定义函数 一 定义 用户自定义函数的类型 1 标量值函数 返回一个标量值 2 表格值函数 内联表格值函数 多语句表值函数 返回一个结果集即返回多个值 二 三种自定函数的异同点 1 同点 创建定义相同 CREATEFUN

    2026年3月20日
    2
  • PrepareStatement概述

    PrepareStatement概述PrepareStatement概述Statement安全问题Statement执行,其实是拼接sql语句的。先拼接sql语句,然后在一起执行。 Stringsql=”select*fromt_userwhereusername='”+username+”‘andpassword='”+password+”‘”; UserDaodao=ne…

    2022年6月11日
    45
  • rabbitmq使用案例_RabbitMq

    rabbitmq使用案例_RabbitMqRabbitMQ使用实践参考网站:http://blog.chinaunix.net/topic/surpershi/http://blog.csdn.net/lwkcn/article/details/25086467http://snoopyxdy.blog.163.com/blog/static/60117440201352615631930/1、简介  MQ

    2026年4月15日
    5
  • jetty和tomcat的区别是什么?

    jetty和tomcat的区别是什么?区别 1 Jetty 架构是基于 Handler 来实现的 主要的扩展功能都可以用 Handler 来实现 扩展简单 Tomcat 架构是基于容器设计的 进行扩展是需要了解 Tomcat 的整体设计结构 不易扩展 2 Jetty 更轻量级 更灵活 Jetty 和 Tomcat 为目前全球范围内最著名的两款开源的 webserver servlet 容器 由于它们的实现都遵循 JavaServlet 规范 一个 JavaWeb 应用部署于两款容器的任意一个皆可 Jetty 是一个开源的 servlet 容器 它为基于 Java 的 web 容器 例如

    2026年3月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号