Maven学习笔记
在学习过程中,参考以下资料。
菜鸟教程:https://www.runoob.com/maven/maven-build-life-cycle.html
尚硅谷-Maven学习笔记:https://blog.youkuaiyun.com/zxm1306192988/article/details/76209062
尚硅谷Java视频教程_Maven视频:https://www.bilibili.com/video/BV1Pt411y7Rh?p=1
1.目前掌握的技术

2.目前的技术在开发中存在的问题【Maven产生的原因】
- 一个项目就是一个工程。
- 工程需要jar包需要我们自己去官网下载。
- 项目中需要的jar包需要我们自己主动导入项目的WEB-INF/lib目录下,而且有可能配置路径。
- 一个jar包依赖的其他jar包需要我们自己手动导入。
3.什么是Maven
- Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理 。Maven 这个单词的本意是:专家,内行。读音是[‘meɪv(ə)n]或[‘mevn]。
构建工具的发展:Make→Ant→Maven→Gradle - 构建:就是以我们编写的Java代码、框架配置文件、国际化等其他资源文件、jsp页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。
- 构建过程中的几个主要环节
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:将每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对象war包。
⑥安装:在Maven环境下特指将打包的结果——Jar包或War包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。 - 自动化构建
将 程序员交付项目时中的必要步骤:编译–>打包–>部署–>测试
交给Maven完成,Maven可以完成自动化构建。无论运行哪一个命令,都是从头重新开始运行。
4.安装Maven
- 在Maven的官网下载压缩包。
官方下载地址:http://maven.apache.org/download.cgi

Maven是一个基于JAVA的工具,官方文档里面也写了需求。Maven3.3要求JDK1.7或以上。而且最好准备一点磁盘空间,因为下载的jar包都会放在本地的仓库里面。
如果不知道自己jdk版本的,可以在命令行里面查看。

```java
检查JAVA_HOME环境变量:echo %JAVA_HOME%
```
-
将Maven核心程序的压缩包,放在一个没有中文没有空格的路径下面。
-
配置Maven相关的环境变量
①MAVEN_HOME

变量名:MAVEN_HOME 变量值:D:\Maven\apache-maven-3.6.3\apache-maven-3.6.3(你自己的解压目录)②path

这里的配置的path路径就是maven的bin目录路径。 -
验证Maven安装

命令查看Maven版本:mvn -v
5.Maven构建生命周期


6.Maven的核心概念
- 约定的目录结构
- POM
- 坐标
- 依赖
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
7.第一个Maven工程
- 创建约定的目录结构

pom.xml文件为Maven工程的核心配置文件。
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。重要程度相当于web.xml 对于动态web工程。
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
POM 中可以指定以下配置:- 项目依赖
- 插件
- 执行目标
- 项目构建 profile
- 项目版本
- 项目开发者列表
- 相关邮件列表信息
- 为什么要遵循约定的目录结构呢?
我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:
①以配置文件的方式明确告诉框架 如 < param-value>classpath:spring-context.xml < /param-value>
②遵循框架内部已经存在的约定 如log4j的配置文件名规定必须为 log4j.properties 或 log4j.xml ;Maven 使用约定的目录结构
8.Maven常用命令
- 执行与构建过程相关的Maven命令,必须进入pom.xml 所在的目录。
- 常用命令
【1】mvn clean : 清理
【2】mvn compile : 编译主程序
【3】mvn test-compile : 编译测试程序
【4】mvn test : 执行测试
【5】mvn package : 打包
【6】mvn install : 安装
【7】mvn site :生成站点
9.联网问题
- Maven 的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须有特定的插件来完成。而插件本身不包含在Maven核心程序中。
- 当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。
- 本地仓库的默认位置:[系统登陆用户的家目录] \ .m2\repository
- Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载。
- 如果此时无法连接外网,则构建失败。
- 修改默认本地仓库的位置可以让Maven核心程序到我们事先准备好的目录下查找插件
①找到Maven解压目录\conf\settings.xml
②在setting.xml 文件中找到 localRepository 标签
③将 < localRepository>/path/to/local/repo< /localRepository>从注释中取出
④将标签体内容修改为自定义的Maven仓库目录
10.Maven的坐标
-
使用下面三个向量在仓库中唯一定位一个Maven工程
①groupid:公司或组织域名倒序+项目名< groupid>com.atguigu.maven< /groupid>②artifactid:模块名
< artifactid>Hello< /artifactid>③version:版本
< version>1.0.0< /version> -
Maven 工程的坐标与仓库中路径的对应关系,以spring为例
< groupId>org.springframework< /groupId> < artifactId>spring-core< /artifactId> < version>4.0.0.RELEASE< /version> org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar -
注意:我们自己的 Maven 工程必须执行安装操作才会进入仓库。安装的命令是:mvn install
11.仓库
-
仓库的分类
①本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
②远程仓库
(1)私服:搭建在局域网环境中,为局域网范围内的所有Maven工程服务

(2)中央仓库:假设在Internet上,为全世界所有Maven工程服务
(3)中央仓库镜像:为了分担中央仓库流量,提升用户访问速度 -
仓库中保存的内容:Maven工程
①Maven自身所需要的插件
②第三方框架或工具的jar包
③我们自己开发的Maven工程
12.依赖
-
当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。Maven解析依赖信息时会到仓库中查找被依赖的jar包。
对于我们自己开发的Maven工程,要使用mvn install 命令安装后就可以进入仓库。

-
依赖的范围
①从项目结构角度理解compile和test的区别

compile范围依赖
》对主程序是否有效:有效
》对测试程序是否有效:有效
》是否参与打包:参与
》是否参与部署:参与
》典型例子:spring-coretest范围依赖
》对主程序是否有效:无效
》对测试程序是否有效:有效
》是否参与打包:不参与
》是否参与部署:不参与
》典型例子:Junit②从开发和运行这两个阶段理解compile 和 provided 的区别
这里写图片描述
》对主程序是否有效:有效
》对测试程序是否有效:有效
》是否参与打包:不参与
》是否参与部署:不参与
》典型例子:Servlet-api.jar③有效性总结

-
依赖的传递性
A依赖B,B依赖C,A能否使用C呢?要看B依赖C的范围是不是compile。

-
依赖的排除
如果我们当前工程中引入了一个依赖是A,而A又依赖了B,那么Maven会自动将A依赖的B引入当前工程,但是个别情况下B有可能是一个不稳定版本,或对当前工程有不良影响。这时我们可以在引入A的时候将B排除。①情景举例

②配置方式<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>③排除后的效果

-
统一管理所依赖 .jar 包的版本
对同一个框架的一组jar包最好使用相同的版本。为了方便升级架构,可以将jar包的版本信息统一提取出来①统一声明版本号

其中 atguigu.spring.version 部分是自定义标签。②引用前面声明的版本号


③其他用法

-
依赖的原则,解决jar包冲突
①路径最短者优先

②路径相同时先声明者优先

13.继承
-
现状
Hello依赖的Junit:4.0
HelloFriend依赖的Junit:4.0
MakeFriends依赖的Junit:4.9
由于test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致。 -
需求
统一管理各个模块工程中对Junit依赖的版本。 -
解决思路
将Junit依赖统一提取到“父”工程中,在子工程中声明Junit依赖是不指定版本,以父工程中统一设定的为准。同时也便于修改。 -
操作步骤
①创建一个Maven工程作为父工程。注意:打包方式为pom

②在子工程中声明对父工程的引用

③将子工程的坐标中与父工程坐标中重复的内容删除

④在父工程中统一管理Junit的依赖

⑤在子工程中删除Junit依赖的版本号部分

注意:配置集成后,执行安装命令时要先安装父工程。
14.聚合
- 作用
一键安装各个模块工程。 - 配置方式
在一个“总的聚合工程”中配置各个参与聚合的模块

- 使用方式
在聚合工程的pom.xml 上点右键->run as->maven install
15.mvnrepository
我们可以到 http://mvnrepository.com/搜索需要的 jar 包的依赖信息。
832

被折叠的 条评论
为什么被折叠?



