maven项目关系依赖
Posted 一宿君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了maven项目关系依赖相关的知识,希望对你有一定的参考价值。
Maven 依赖管理
Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven提供了一种高度控制的方法。
可传递性依赖发现
- 一种相当常见的情况,比如说 A 依赖于其他库 B。如果,另外一个项目 C 想要使用 A ,那么 C 项目也需要使用库 B。
- Maven 可以避免去搜索所有所需库的需求。Maven 通过读取项目文件(pom.xml),找出它们项目之间的依赖关系。
- 我们需要做的只是在每个项目的 pom 中定义好直接的依赖关系。其他的事情 Maven 会帮我们搞定。
1、首先在idea中创建一个空项目
2、ideaworkspace空项目建好后,在这个空项目空间中,点击新建模块
同上述步骤,再次创建模块ebuy-2:
3、maven项目依赖关系
3.1、简单来说就是连个项目之间可以相互依赖,并且使用彼此的jar包依赖文件。
我们简单举个例子,就是在项目ebuy-1中引入依赖文件,在项目ebuy-2中引用项目ebuy-1。
3.2、简单测试一下mysql驱动依赖在ebuy-2中是否可以用
上述情况时,ebuy-2项目中引用了ebuy-1项目,而ebuy-1项目又依赖了mysql驱动包,所以就都在ebuy-2项目中显示出来了,并且经过测试cbuy-2可以使用引用的mysql驱动。
3.3、跨项目工具类引用
3.4、maven依赖控制范围
scope标签参数如下:
- compile:编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种 classpath 都有效,即在编译、测试和运行的时候都要使用该依赖jar包;
- test:测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试classpath,而在编译和运行项目时无法使用此类依赖,典型的是JUnit,它只用于编译测试代码和运行测试代码的时候才需要;
- provided:此依赖范围,对于编译和测试classpath有效,而对运行时无效;
- runtime:运行时依赖范围,对于测试和运行classpath有效,但是在编译主代码时无效,典型的就是JDBC驱动实现(这个一般很少用到);
optional标签参数如下:
- 如果是true,则表示该项目下的jar包不能被引用,但是该项目还是可以被引用的,其工具类也不受限制。
- 如果是false,则表示该项目下的jar包可以被引用,但是该项目还是可以被引用的,其工具类也不受限制。
scope默认是compile
optional默认是false
3.6、maven依赖排除
在项目引用中,我们一般会将所有jar包和工具类创建在一个项目中,然后这个项目供其他项目引用,也就行相当于调用。但是有时候我们在其他项目中需要使用某个jar包的更高版本,这个时候从引用项目中所得到的jar包就不适用了,还需要我们自己再导入更高版本的依赖文件,然后再把原来的引用项目所得到的jar包给排除掉。
演示如下:
4、maven项目继承关系(推荐)
4.1、parent继承方式
注意:
此处的继承在以后的实际开发项目中,聚合工程会用到的很多(很重要)。
4.2、dependencyManagement使用简介
Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息(也即是在父项目中声明),那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号,只需列出所需要用的依赖。Maven会沿着父子层级向上寻找拥有dependencyManagement
元素的项目,然后使用它指定的版本号。
4.3、实例演示:
- 在父项目ebuy-1中:
- 在子项目ebuy-2中:
- 如果我们在子项目中输入相关依赖的版本号:
4.4、使用优点
如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号。当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要逐个修改子项目;另外如果某个子项目需要另外的一个版本,只需要声明version即可,会自动覆盖掉父项目中的version。
4.5、注意事项
dependencyManagement中定义的只是依赖的声明,并不实现引入,因此子项目需要显式的声明需要用的依赖。
以上是关于maven项目关系依赖的主要内容,如果未能解决你的问题,请参考以下文章