Maven Dependency Mechanism (Maven依赖机制)
Transitive
Transitive 的意思在很多翻译网站上是:
transitive | |
英[ˈtrænsətɪv] | 美[ˈtrænsɪtɪv, -zɪ-] |
adj. | 过渡的; (指动词) 及物的; 转变的; <数><逻>可递的; |
n. | <语>及物动词; |
[例句]The verbs were subdivided into transitive and intransitive categories.
在数学中,Transitive 表示传递性, 如
已知 a > b, b > c,
则可以得到 a > c, 这是传递性
Transitive Dependencies
Maven 中的依赖具有传递性
如果项目A 依赖于项目B,而项目B依赖于项目C,则项目A也依赖于项目C
使用符号“->"来表示项目间的依赖关系: A->B ,项目A依赖于项目B
Transitive Dependencies 的几个关键点:
- Dependency Mediation, 依赖调解
- Scope, 作用域
- Exclude, 不包括
- Optional
例子:
<dependency>
<groupId>com.yin</groupId>
<artifactId>maven-project-1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>com.xxxx</artifactId>
<groupId>xxxx-project</groupId>
</exclusion>
</exclusions>
<optional>true</optional>
</dependency>
Dependency Mediation
路径长度相同,版本不同
A->B->E1.0
A->C->E2.0
此时会选择E2.0, 因为它的版本更新。
路径长度不同,选择路径长度更小的
A->B1.0,
A->C->B2.0
此时选择B1.0, 因为它的路径更短
Scope
Compiler, 默认scope,编译时和运行时都需要
Test, 仅测试编译和测试时需要
Provider, 编译时需要,运行时不需要
Runtime, 与Provider相反,运行时需要,编译时不需要
Exclude
如果A->B->C, 而A并不想将C作为依赖,可以配置Excludesions
Optional
切断依赖的传递性
Dependency Manager
考虑项目A和项目B有多个相同的依赖,为了避免重复配置,可以:
创建一个新的项目C,将A/B相同的依赖写在C中,然后
B->C, A->C
或者使用Dependency Manager和<parent></parent>父项目。
父项目如下,配置了packing是POM,以及depedencyManager
<project>
<groupId>..</>
<artifactId>....
<version>....
<packing>POM</packing>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.5</version>
</dependency>
</dependencies>
</dependencyManagement></project>
子项目如下:
<project>
<parent>
<groupId>
<artifactId>
<version>
</parent>
<dependencies>
<depedency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId> // 由于在父project中定义了该依赖的version是1.5,这里将不再需要声明version// 注意:父项目的Dependency Manager配置的依赖不会自动成为子项目的依赖
</depedency>
<dependencies>
</project>
如果项目A是项目B的父项目,而A中的Dependency Manager声明了依赖C使用verison1.0 ,但项目B有自己的Dependency Manager声明了依赖C使用version2.0,则项目B的配置会覆盖父项目的配置。
总结一下就是:子项目会继承父项目的<dependencies> 和 <dependencyManager> ,然后子项目可以覆盖里面的dependency
Import Dependency,依赖导入
在前面讲了父项目跟子项目,这是一种类似“单继承”的模式。
Maven还有类似“多继承”的设置,或者叫“一个项目可以导入多个公共library项目”。
首先library项目的写法与前面的父项目的写法一致。
之后,在引用此library的项目中需要配置:
<project>
// 这里不再使用<parent>来导入别的项目
<dependencyManager>
<dependencies>
<dependency><groupId>
<artifactId>
<version
<type>POM</type>
<scope>import</scope> // 这2个配置很重要。
// 注意:library中的依赖也不是自动成为当前项目的依赖。这点与配置父项目是一样的。
</dependency>
</de 4000 pendencies>
</dependencyManager>
</project>
- [转]Maven Dependency Mechanism - 依赖管理机制
- Intellij IDEA创建maven项目后,dependency显示红线,依赖没有建立成功
- 使用Maven插件maven-dependency-plugin拷贝所有依赖的jar和pom文件
- Maven依赖机制 工作原理 (分析maven项目和非maven项目的差别)
- Maven依赖机制理解
- Maven的依赖机制
- Maven学习(八)-----Maven依赖机制
- maven export dependency 导出依赖包的命令
- 用dependency:tree查看maven引入jar包的传递依赖
- Maven的依赖机制介绍
- Maven依赖机制
- maven 学习---Maven依赖机制
- maven-jar-plugin maven-dependency-plugin 打包依赖包版本不一致解决办法
- Maven:浅析依赖(dependency)关系中 scope 的含义
- Maven学习九:依赖-dependency
- Maven的依赖机制简介
- Maven中dependency(依赖)的scope(作用域)
- 用dependency:tree查看maven引入jar包的传递依赖
- 六、Maven依赖机制
- Maven-依赖管理机制