一.Maven介绍与功能
maven是一个项目管理和构建工具,是基于对象模型POM实现。
Maven的作用:
- 便捷的依赖管理:使用Maven可以简化依赖管理过程。通过在项目的pom.xml文件中声明依赖关系,Maven可以自动下载所需的依赖库,并将它们添加到项目的类路径中。这消除了手动下载和配置jar包的繁琐过程,使依赖管理更加方便和可靠。
- 统一的项目结构:Maven定义了标准的项目结构,规定了源代码、资源文件、测试代码等目录的布局方式。这使得不同IDE(如Eclipse、IntelliJ IDEA)之间可以共享和识别相同的项目结构,简化了项目之间的迁移和协作。
- 标准的项目构建流程:Maven提供了一套标准化的项目构建流程。通过执行Maven命令,可以进行项目的编译、测试、打包、部署等一系列操作。这种标准化的构建流程确保了项目的一致性和可重复性,提高了开发效率。
编辑
二.依赖管理
1.依赖的配置
所谓的依赖指的就是当前项目所需要的jar包,一个项目可以引入多个jar包
案例:导入多个包 mysql、ch.qos.logback两个包
首先打开maven项目工程找到pom.xml
设置依赖标签
<!-- 设置标签依赖--> <dependencies> <!-- 设置具体依赖--> <dependency> <!-- 配置代表项目或组织的唯一标识符--> <groupId>ch.qos.logback</groupId> <!-- 配置代表特定项目的唯一标识符--> <artifactId>logback-classic</artifactId> <!-- 配置版本号--> <version>1.2.3</version> </dependency> <!-- 操作类似--> <dependency> <groupId>mysql-java</groupId> <artifactId>mysql-java</artifactId> <version>5.1.21</version> </dependency> </dependencies>
如果以前没有使用过相关jar包,则会冒红报错,因为在本地仓库没有找到相关的jar包
编辑
2.依赖的传递性
如果一个项目projectA依赖了一个A-jar包,而一个A-jar包中又依赖了其他的jar包,那么projectA对应的也就依赖了A-jar包对应的其他jar包
编辑
依赖传递有两种:一种是直接依赖,一种是间接依赖
编辑
通过图标形势查看依赖关系
在pom中右键找到图再点击显示依赖项
编辑
这样就可以清晰看到项目之间的依赖
编辑 当然依赖可能会产生一个特殊情况,A->B->A 循环依赖,项目A依赖了项目B,而项目B依赖了项目A。这种情况也是面试题常问的一个问题
面试题:Maven中如何解决依赖循环的问题
- 重构代码结构:首先,我们可以检查项目结构并尝试重构代码以消除依赖循环。这可能需要重新设计模块之间的关系,将公共功能提取到独立的模块中,或者修改模块的依赖关系,以确保它们形成一个有向无环图(DAG)。
- 使用接口或抽象类:如果依赖循环是由于具体类之间的相互依赖引起的,我们可以考虑使用接口或抽象类来解耦它们。这样,依赖关系将变得单向,并且可以更容易地管理。
- 使用Maven插件:Maven提供了一些插件来帮助解决依赖循环问题。例如,可以使用Maven的
maven-dependency-plugin
来分析项目依赖关系,并找出导致循环的依赖。然后,我们可以使用exclude
或optional
标记,将其中一个模块的依赖排除或设置为可选,以打破循环。- 模块拆分:另一种方法是将存在依赖循环的模块拆分为更小的、相互独立的模块。这样,我们可以将它们放在不同的项目中,并使用Maven的多模块项目进行管理。通过将功能划分到不同的模块中,可以更好地管理和控制它们之间的依赖关系。
3.排除依赖
由上面的内容可以知道依赖具有传递性,PorjectA项目会依赖A-jar包下的所有依赖jar包。但是如果明确知道工程ProjectA中只需要A-jar包,不需要A-jar包下的某一个包,则可以通过<exclustions>标签和<exclustion>实现排除依赖
<exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </exclusion> </exclusions>
编辑
可以看到用了排除依赖后相关jar包就不存在了编辑
4.依赖的作用范围
依赖的jar包,在默认情况下,可以在任何地方使用,或者也可以通过<scope></ scope>标签来设置相应jar包的作用范围
作用范围:
- 主程序范围有效(main文件夹内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包运行(package指令范围内)
编辑
scope标签值与对应的作用范围
编辑
案例:
设置logback的jar包的范围为test,实现只能在test测试程序中运行
编辑
注意不要忘了点击更新
编辑
接下来测试是否更改了作用范围:
1.在test中使用logback的jar包对象,可以看到有提示相应的jar包
编辑
2.在main中使用则会发现并没有相应的jar包
编辑
5.依赖的生命周期
在Maven中有三套相互独立的生命周期
- clean 负责清理上一次编译产生的字节码文件
- default 核心工作 负责编译、测试、打包、安装、部署等等
- site 生成报告、发布站点等
每一套生命周期都有许多的生命周期阶段,但是我们需要用到的生命周期并不需要太多,只需要掌握以下几个核心生命周期的阶段即可
核心的生命周期阶段
- clean :移除上一次构建生成的文件
- compile: 编译项目的源代码
- test:使用合适的单元测试框架运行测试
- package:将编译后的文件进行打包
- install:安装项目到本地仓库
编辑
注意:同一套的生命周期的运行是由循序的,后面的生命周期的运行是需要依赖前面的生命周期的运行。所以如果使用后面的生命周期阶段,就会自动执行前面的生命周期
比如运行test,会自动运行validate与compile,但是不会运行clean,因为clean与这些不是同一套的生命周期
运行指定的生命周期
有两种方式运行指定的生命周期
第一种,找到右侧栏中的maven打开项目下的生命周期,找到对应周期双击运行即可
编辑
第二种,在idea或者cmd中输入指令 mvn xxx即可执行对应的生命周期阶段
编辑
周期跳过
在工程文件中找到生命周期,找到小闪电图标,点击即可跳过对应的生命周期。
编辑