Maven学习
目前掌握的javaweb开发技术
目前的技术存在的问题–>Maven的产生
-
一个项目就是一个工程
如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个项目,利于分工协作。
借助于maven就可以将一个项目拆分成多个工程。 -
jar包需要别人替我们准备好,或到官网下载
所有知名框架或第三方工具jar包已经按照统一规范放在了Maven的中央仓库中。 -
项目中需要的jar包必须手动“复制”、”粘贴” 到WEB-INF/lib 项目下
带来的问题:同样的jar包文件重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。
借助Maven,可以将jar包仅仅保存在“仓库”中,有需要使用的工程“引用”这个文件,并不需要重复复制。 -
一个jar包依赖的其他jar包需要自己手动加到项目中
Maven会自动将被依赖的jar包导入进来
Maven是一个软件项目管理的工具
Maven的功能:
- 改进项目的开发和管理
1 )maven可以管理jar文件
2 )自动下载jar和它的文档、源代码
3 )管理jar的直接依赖,比如 a.jar需要b.jar 则自动下载b.jar
4)管理你所需要的jar版本
5 )帮你编译程序,把java编译为class
6 )帮你测试代码是否正确
7 )帮你打包文件,形成jar文件或war文件
8 )帮你部署项目
构建过程:
- 项目的构建 构建是面向过程的,就是一些步骤,完成项目代码的编译、运行、测试、打包、部署等等
1)清理:把之前的项目全部清理干净
2)编译,把程序源代码编译为执行代码 java-class文件 这个操作是批量的 而javac的编译是一次编译一个文件
3)测试:maven对代码的测试也是批量的,可以同时执行多个代码,测试多个功能
4)报告:生成测试结果的文件,报告测试是否出现错误
5)打包:将class文件、配置文件压缩为一个文件,java程序通常以jar结尾 web文件以war结尾
6)安装:将5)中的jar或者war文件安装到本机仓库
7)部署:通常是人工部署
Maven前后的工作流程对比
Maven核心概念
约定的目录结构:Maven中约定大于配置
POM(project on object)项目对象模型
- 是一个文件,文件名为 pom.xml ,Maven把一个项目的内容和结构抽象成一个模型,在xml文件中进行声明,以方便构建和描述,控制maven构建项目的过程,管理jar依赖
1)坐标:唯一值,在互联网中唯一标识一个项目
3)properties:设置属性
4)build:maven在构建项目时,配置信息,如指定编译java代码使用的jdk版本号
Maven仓库
①本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
②远程仓库
(1)私服:搭建在局域网环境中,为局域网范围内的所有Maven工程服务
(2)中央仓库:假设在Internet上,为全世界所有Maven工程服务
(3)中央仓库镜像:为了分担中央仓库流量,提升用户访问速度
- 仓库中保存的内容:Maven工程
①Maven自身所需要的插件
②第三方框架或工具的jar包
③我们自己开发的Maven工程
依赖
-
依赖的范围,默认的依赖范围是compile,除了图中列出的三种依赖,还有runtime、system 和import
比如说servlet-api,在项目运行阶段是由Servlet容器提供的,如果你的范围设置为compile,那就会冲突报错 -
依赖的传递性
-
依赖的原则
最短路径优先原则:如果A 依赖于B,B 依赖于C,在B 和C 中同时有log4j 的依赖,并且这两个版本不一致,那么A 会根据最短路径原则,在A 中会传递过来B 的log4j版本
路径相同先声明原则:如果在A 同时依赖于B 和C,B 和C 没有依赖关系,并且都有log4j 的依赖,且版本不一致,那么A 会引入在pom.xml
中先声明依赖的log4j 版本
-
依赖的排除
<dependency> <groupId>com.atguigu.maven</groupId> <artifactId>HelloFriend</artifactId> <version>0.0.1-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> <exclusions> < exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </ exclusion> </exclusions> </dependency>
生命周期
- Maven有三套相互独立的生命周期,分别是:
①Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
②Default Lifecycle 构建的核心部分,编译、测试、打包、安装、部署等等。
③Site Lifecycle 生成项目报告,站点,发布站点。
继承
聚合
[详情可参考此篇文章]((1条消息) 尚硅谷-Maven学习笔记_无关风月-CSDN博客_maven笔记)
依赖和插件有什么不同?
依赖的话就相当于你用c写代码时候引用的库文件。你之所以引用这些库是因为你需要它里面的函数,需要通过这些函数构建自己的代码。所以最终你调用的库函数成为了你代码的一部分。
插件呢,相当于你用word写文档时候最上面工具栏里面的工具,比如你可以通过‘插入图片’工具往word里面插入一张喜欢的图片。可是插件与你的文本本身不发生任何关系。
回到maven,依赖中被你调用过的函数会与你的代码一起进行编译。对于插件来说呢,比如有些插件是帮助你进行编译工作的,你不用手动写javac一个个去编译。插件就相当于小程序(其实是脚本)。
插件是一种工具,例如compile插件是用来编译代码的工具,mybatis插件是用来自动生成数据库dao和mapper的工具。而依赖则是项目工程在编译过程中需要依赖的二方及三方包。在你的工程中可以不需要mybatis插件,自己去实现sql的crud,但如果工程里需要三房包,则必须要用dependency引入。
参考:
[详情可参考此篇文章]((1条消息) 尚硅谷-Maven学习笔记_无关风月-CSDN博客_maven笔记)