问题再现:

上次这边朋友问我一个问题,就是他们在pom.xml中的dependency中,看到有一些是<scope>provided</scope>的情况,比如如下:

  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://www.cnblogs.com/Jeely/p/10794878.html

maven dependency中scope=compile 和 provided区别相关推荐

  1. Maven 依赖中 scope 详解

    前言 Maven 的哲学思想是,约定优于配置(Convention Over Configuration),Maven 依赖中 scope 的默认值是compile Scope 指定了依赖(第三方ja ...

  2. Maven学习总结(50)——Maven Dependency的 Scope 属性详解

    Dependency Scope 在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值: com ...

  3. Maven依赖中scope的runtime和provied的区别

    <scope>runtime</scope> runtime 用在 Class.forName("com.mysql.jdbc.Driver") 时,com ...

  4. Maven dependency下scope详解

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

  5. Maven依赖中groupId和artifactId的区别

    这两个是坐标 为了保证项目的唯一性.想要在一个大项目中找到一个小项目 就必须要根据这两个坐标进行查找. groupId一般是 domain+compnay_name: org.Apache artif ...

  6. 《SpringSecurityOauth2》SpringOauth2.0 中 scope 和 authorities的区别

     scope scope is client authorities/roles, Empty if the client isn't scoped. client只有scope(作用域),但我们可以 ...

  7. maven中pom文件中scope的作用

    Dependency Scope <dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值: compile 默认就 ...

  8. maven中scope属性的

    转载自 maven中scope属性的 Dependency Scope 在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<sc ...

  9. maven依赖关系中Scope的作用

    Dependency Scope 在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值: * c ...

最新文章

  1. CentOS6.3的Grub启动项的menu.lst文件内容
  2. 让我当你的圣诞老人吧,派发3本技术好书
  3. BI软件应用在哪些方面
  4. Codeforces 853A 贪心 优先队列
  5. 路由器交换机[置顶] 路由器和交换机的综合实验⑵
  6. sqlyog与mysql编码语法_如何解决sqlyog连接的数据库乱码的问题
  7. 数字证书及 CA 的扫盲介绍
  8. tpac100控制器设置教程_ac100控制器设置方法
  9. 正太分布函数 oracle,Oracle随机函数
  10. 安卓模拟ibeacon_Android BLE-iBeacon系列(一)iBeacon介绍
  11. 三星pay显示无法连接服务器,三星智付Samsung pay正式开启:服务器宕机 三星紧急发公告...
  12. 哈工大人工智能研究院院长刘劼:打造从科研到产业的创新生态
  13. 友盟朋友圈社区使用详解-(无UI版)
  14. 行内元素设置margin:0 auto无效的问题
  15. 数值分析试验四 runge_kutta 龙格库塔c++代码
  16. poj2965 The Pilots Brothers' refrigerator
  17. powerCenter介绍
  18. 如何解决在打开pip时遇到Fatal error in launcher: Unable to create process using 的问题
  19. TO BE A BETTER MAN(纪念时光)
  20. 【ARM-Linux开发】嵌入式操作系统上的小型数据库移植SQLite

热门文章

  1. 20170824图论选讲部分习题
  2. 触发器代码(更新表A数据自动更新表B字段列)
  3. Javascript中的typeof() 与undefined 与undefined
  4. 只需 4 步,自己搞个 Spring Boot Starter!
  5. 终于有人把 Nginx 说清楚了,图文详解!
  6. 如何设计真正高性能高并发分布式系统(万字长文)
  7. 实用技巧:教你如何在没有网络的Linux机器上快速安装软件
  8. 中国SaaS死或生之六:逢场作戏or脚踏实地?
  9. 设置eclipse文件的默认打开方式
  10. html基础--列表标签03,03HTML基础--列表标签