`

maven dependency中scope=compile 和 provided区别

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

<dependency> 
   <groupId>com.liferay.portal</groupId> 
   <artifactId>portal-impl</artifactId> 
   <version>6.1.0</version> 
   <scope>provided</scope> 
</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包。这也避免了此类构件当部署到目标容器后产生包依赖冲突。

参考:http://supercharles888.blog.51cto.com/609344/981316/
分享到:
评论

相关推荐

    maven 关于 scope test 和 继承传递的问题

    本文将深入探讨"Maven中scope test的使用以及依赖继承传递"这一主题,帮助开发者更好地理解和应用Maven的核心特性。 首先,`scope test`是Maven依赖管理中的一个关键概念。当我们在`pom.xml`文件中为某个依赖设置`...

    Maven的Dependency测试

    **Maven的Dependency测试**...总之,Maven的Dependency测试是Java开发中至关重要的部分,通过合理地配置和管理依赖,可以保证项目的稳定性和可维护性。了解和掌握这些知识,对于提升开发效率和团队协作有着积极的影响。

    maven依赖关系中的&lt;scope&gt;provided&lt;/scope&gt;使用详解

    `&lt;scope&gt;provided&lt;/scope&gt;`是Maven中的一种依赖范围,它主要用于那些由JDK或者应用服务器提供的库,比如Servlet API和其他Java EE相关的API。使用`&lt;scope&gt;provided&lt;/scope&gt;`表明Maven在编译和测试期间会使用这些依赖...

    Maven之scope依赖范围.docx

    在Maven项目管理中,`scope`依赖范围是至关重要的概念,它决定了一个依赖在项目的不同阶段如何被引入和使用。Maven有多种scope类型,每个类型都有特定的适用场景和目的,帮助开发者精确控制项目的依赖关系。 1. **...

    Maven 依赖详细理解.pdf

    scope定义了依赖项的使用范围,主要有以下几个选项:compile、provided、runtime和test。compile表示依赖项在编译时需要,provided表示依赖项在编译和测试时需要,但运行时不需要。runtime表示依赖项在运行时需要,...

    Maven2 的新特性.7z

    在使用Maven2执行compile之后,这个目录中的所有文件及子目录,会复制到target/classes目录中,为以后的打包提供了方便。 • src/test/resources,负责管理项目测试的资源。在使用Maven2执行test-compile之后,这个...

    Maven Web基础搭建示例

    &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; &lt;!-- 添加其他依赖 --&gt; ... ``` ### 四、编写Web应用 在`src/main/java`下创建你的Java类,例如Servlet,实现业务逻辑。在`src/main/webapp/WEB-INF`下编写`web.xml`...

    mavenweb项目创建demo

    &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; ``` 构建过程可以通过Maven命令行完成,如`mvn clean compile`用于清理项目并编译源代码,`mvn package`会打包成war文件。Maven的生命周期有许多阶段,如validate、...

    maven常用命令

    Maven 是一个强大的构建工具,主要用于管理 Java 项目的构建、依赖和文档生成。以下是一些 Maven 的常用命令,它们可以帮助开发者更有效地操作项目。 1. **显示插件的所有 Goal** 使用 `mvn help:describe -...

    maven使用文档,maven使用文档

    - Maven 的依赖范围包括 compile、test、provided、runtime、system 和 import。 - 不同的依赖范围决定了该依赖是否会被包含在最终的构建产物中。 8. **排除依赖** - Maven 允许在 POM 文件中使用 exclusions ...

    maven-javaweb入门

    Maven的默认生命周期包括编译(compile)、测试(test)、打包(package)、验证(verify)、安装(install)和部署(deploy)。对于JavaWeb项目,我们主要关注`package`阶段,Maven会将项目打包成WAR文件,可以...

    Maven2 5分钟学习教程(中文)----maven2 官方文档翻译

    3. **依赖管理(Dependency Management)**:Maven通过POM自动管理项目的依赖库,只需在POM中声明依赖,Maven会自动下载并解决依赖关系。 4. **生命周期(Lifecycle)**:Maven有三个主要生命周期:clean、default...

    maven用到的些东西

    9. **依赖范围(Dependency Scope)**:Maven允许为每个依赖指定范围,如编译(compile)、测试(test)、运行时(runtime)、提供(provided)、系统(system)。不同范围决定了依赖在哪些构建阶段可用。 10. **...

    maven学习记录

    Maven是一款由Apache组织开发的项目管理和整合工具。它可以帮助开发者轻松地管理项目的构建、依赖关系以及文档等。Maven的核心优势在于它能够自动化构建过程,并且通过预定义的生命周期来规范项目的构建流程。 ### ...

    maven的入门使用

    &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; ``` - **清理、编译和安装项目**:执行 Maven 命令 `mvn clean compile install` 来完成项目的清理、编译和安装。 #### 三、Maven 生成 Eclipse 项目 **1. 导入 ...

    maven ---servlet3.1项目模板

    这里的`&lt;scope&gt;provided&lt;/scope&gt;`表示Servlet API已经在服务器环境中提供,因此在打包时不需要包含。 【 Maven 的构建过程】 Maven有三个主要的生命周期阶段:compile、test和package。在Servlet3.1项目中,这些...

    maven-apache-maven-3.5.3.zip

    **Maven的依赖范围(Dependency Scope):** 1. `compile`:默认范围,编译时可用,打包时包含。 2. `test`:测试范围,仅在测试时可用,打包时不包含。 3. `runtime`:运行时范围,运行和测试时可用,打包时不包含...

    maven学习教程分享

    Maven是Java开发中的一款项目管理和综合工具,由Apache软件基金会开发。它通过提供一套标准的构建过程和依赖管理机制,简化了项目的构建、测试、部署等生命周期管理。本教程将深入探讨Maven的核心概念和使用技巧,...

    maven 安装包用于项目管理

    - 依赖范围(Scope):如编译(compile)、测试(test)、运行时(runtime)、提供者(provided)、系统(system)等,不同范围的依赖在不同阶段发挥作用。 - 面向Profile的构建:通过定义不同环境的配置...

Global site tag (gtag.js) - Google Analytics