背景
最近在学习《maven实战》这本书,在看到依赖传递这部分的时候,我发现书本提供的依赖传递表有点不合理,就去官网看文档,最后发现官网提供的表和《maven实战》提供的表不一致,我觉得一切要以官网的为准,同时参考了这篇文章的一部分内容,http://seanzhou.iteye.com/blog/1688740。
官网文档片段
摘抄日期为2015年5月13日,如果后续有变化,再说。
=======================================================================================
Dependency scope is used to limit the transitivity of a dependency, and also to affect the classpath used for various build tasks.
There are 6 scopes available:
-
compile
This is the default scope, used if none is specified. Compile dependencies are available in all classpaths of a project. Furthermore, those dependencies are propagated to dependent projects.
-
provided
This is much likecompile, but indicates you expect the JDK or a container to provide the dependency at runtime. For
example, when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scopeprovidedbecause
the web container provides those classes. This scope is only available on the compilation and test classpath, and is not transitive.
-
runtime
This scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath.
-
test
This scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases.
-
system
This scope is similar toprovidedexcept that you have to provide the JAR which contains it explicitly. The artifact
is always available and is not looked up in a repository.
-
import(only available in Maven 2.0.9 or later)
This scope is only used on a dependency of typepomin the<dependencyManagement>section.
It indicates that the specified POM should be replaced with the dependencies in that POM's<dependencyManagement>section.
Since they are replaced, dependencies with a scope ofimportdo not actually participate in limiting the transitivity
of a dependency.
Each of the scopes (except forimport) affects transitive dependencies in different ways, as is demonstrated in the
table below. If a dependency is set to the scope in the left column, transitive dependencies of that dependency with the scope across the top row will result in a dependency in the main project with the scope listed at the intersection. If no scope is listed,
it means the dependency will be omitted.
|
compile |
provided |
runtime |
test |
compile |
compile(*) |
- |
runtime |
- |
provided |
provided |
- |
provided |
- |
runtime |
runtime |
- |
runtime |
- |
test |
test |
- |
test |
- |
(*) Note:it is intended that this should be runtime scope instead, so that all compile dependencies must be explicitly listed - however, there is the case where the library you depend on extends a class from another library, forcing you to
have available at compile time. For this reason, compile time dependencies remain as compile scope even when they are transitive.
===========================================================================================================
依赖范围
俺英语不好,但是 这些英文不会太难,我仅把自己的理解写下来,如果哪里说错了,你来打我呀!
依赖范围用于限制依赖关系的传递性并影响到用于各种构建任务classpath,传递性表现在具体某个时间段具有依赖性,一共有三种时间段:在编译源代码时
、在编译测试代码及运行测试用例时、在运行时。
1、compile是默认的依赖范围,使用此依赖范围的Maven依赖,对于编译、测试、运行三种 classpath 都有效;
2、test只对于测试classpath 有效,测试classpath包括测试编译和测试运行;
3、provided对于编译和测试classpath有效,但在运行时无效;
4、runtime对于测试和运行classpath有效,但在编译主代码时无效;
5、system和 Provided 依赖范围完全一致,但是,使用 System 范围的依赖时必须通过 systemPath 元素显式地指定依赖文件的路径;
6、impor只用于<dependencyManagement>标签,它会引入其他POM的dependencyManagement的内容,并不参与到依赖传递。
依赖传递
假设a对b的依赖为第一依赖,b对c的依赖为第二依赖
1、表格下的英文可以理解为,a对b的依赖是指a依赖b的字节码文件,只要b是编译好的且b没有继承c中的某个类,则a在编译时不依赖c,如果b继承了c中的某个类,则a在编译时依赖c;
2、第二依赖为test的时候,第一依赖无论是什么都与b的测试代码没有关系,因此依赖不传递;
3、第二依赖为provided的时候,依赖不传递;
4、第二依赖为compile的时候,传递性依赖和第一依赖一样;
5、第二依赖为runtime的时候,除了第一依赖为compile时传递性依赖是runtime,传递性依赖和第一依赖一样;
分享到:
相关推荐
Maven依赖管理遵循“传递性”原则,即如果你的项目依赖A库,而A库又依赖B库,Maven会自动将B库也一并引入。这大大简化了项目的构建过程,但同时也可能导致依赖冲突,需要通过排除机制或调整依赖版本来解决。 在`...
六、Maven依赖传递和依赖冲突 1. Maven依赖传递特性 Maven会自动处理项目的依赖及其依赖的依赖,称为依赖传递。 2. Maven依赖冲突特性 当不同依赖引入了相同但不同版本的库时,会产生依赖冲突。Maven遵循“nearest ...
Maven依赖库是开发Java应用程序时不可或缺的资源,它包含了各种常用的jar包,这些包提供了丰富的功能,涵盖了数据处理、网络通信、XML解析等多个领域。在本文中,我们将深入探讨maven_repository.zip压缩包中的几个...
依赖范围(scope)是Maven依赖管理的一个重要概念。scope定义了依赖项的使用范围,主要有以下几个选项:compile、provided、runtime和test。compile表示依赖项在编译时需要,provided表示依赖项在编译和测试时需要,但...
【Maven的依赖验证项目】是一个关于Maven项目管理和依赖管理的实践案例,它与CSDN博主songdeitao的一篇文章《Maven依赖管理详解》相关联。在这个项目中,我们将深入理解Maven如何处理项目的依赖关系,以及如何有效地...
以下是ojdbc8的Maven依赖配置示例: ```xml <groupId>com.oracle.ojdbc</groupId> <artifactId>ojdbc8 <version>19.7.0.0 <scope>compile ``` 这里,`groupId`是`com.oracle.ojdbc`,`artifactId`是`...
使用Maven核心概念介绍(坐标、依赖、仓库、插件、生命周期等)、Maven与第三方Elicpse整合及如何在Eclipse中使用Maven、什么是私服、Maven为什么...任亮系列-maven依赖传递和可选依赖和排除依赖.mp41313.任亮系列-mav
综上所述,这个Maven项目配置了一系列关键的依赖库,旨在构建一个功能完善的Web服务客户端。通过对这些依赖的详细了解,可以帮助开发者更好地理解和维护项目,同时也有助于进一步扩展项目功能。
标题"maven依赖包"暗示了我们正在讨论的是Maven如何处理项目的外部依赖。在Java应用开发中,项目通常会依赖许多第三方库,如Spring、Hibernate、Apache Commons等。Maven的中央仓库存储了大量的开源项目JAR包,...
**二、Maven依赖原则** Maven的依赖原则主要为了解决多个依赖之间的版本冲突问题,它遵循两个基本规则: 1. **路径最短优先原则**:当两个不同版本的相同依赖出现在依赖树中,Maven会选择路径较短的那个版本。例如...
Maven依赖管理遵循“传递性”原则,即项目可以直接依赖其他项目,间接依赖也会被自动引入。当出现相同类路径的冲突时,Maven会遵循“第一声明者优先”原则,即先声明的依赖版本优先。 2. **排除依赖(Exclusions)...
#### Maven依赖传递 依赖传递是指当项目依赖某个库时,这个库所依赖的其他库也会被自动加入到项目的构建路径中。例如,spring-webmvc依赖了spring-beans,那么spring-beans也会被加入到项目中。 #### Maven依赖冲突...
### Maven依赖本地JAR包的方法 #### 1. 使用`<systemPath>`标签 Maven提供了`<scope>system</scope>`这一特殊作用域,用于指定本地文件系统上的特定路径,以便在构建过程中引用这些路径下的JAR文件。这种方式要求...
在这个名为"Maven依赖包(用于博客项目)v2"的压缩包中,我们可以推测它包含了为一个博客项目准备的特定Maven依赖库。 Maven依赖管理的核心在于它的`pom.xml`文件,这是一个项目对象模型(Project Object Model)的...
#### Maven依赖传递 依赖传递是指,当项目A依赖于项目B,而项目B又依赖于项目C时,项目A也会间接依赖于项目C。这种传递性可以帮助减少配置的复杂度,但同时也可能导致版本冲突。Maven通过一定的规则来处理这些冲突...
总的来说,解决Maven依赖冲突需要理解其工作原理,结合IDEA提供的工具,如Maven Helper插件和依赖结构图,可以有效地定位和排除冲突,保持项目的稳定性和可维护性。在实际开发中,避免引入不必要的依赖和定期清理...
2. **理解依赖传递性**:Maven会自动处理依赖的依赖,但可能会导致依赖冲突,需要通过 `<exclusions>` 标签排除不需要的子依赖。 3. **管理本地仓库**:定期清理无用的旧版本依赖,避免仓库过大影响性能。 4. **使用...
规则用于处理传递Maven依赖项。 这里的“专家”一词是指“专家工件”,而不是工具“ mvn”。 此仓库利用gradle协助进行传递依赖项管理,因此提供了徽标参考。 规则 名称 描述 加载此仓库的依赖项。 声明一个外部...