Maven 理论以及操作
现有技术总结
目前的技术在项目开发中遇到的问题
-
一个项目就是一个工程
- 如果项目非常庞大,就不适合利用 package 来划分模块,期望每一个模块对应-一个工程, 然后每个工程之间还要相互调用. Maven可以满足我们的要求.
-
项目中需要的 jar 包是通过手动导入,“复制” “粘贴”到
WEB-INF/lib
目录下- 同样的 jar 包重复出现在不同的工程中.浪费存储空间.工程非常臃肿。
- 使用 maven ,可以将 jar 包统一保存到<font color=red>仓库</font>中,在工程中去引用”仓库”中的 jar 包即可,并不会把jar包复制到工程.
-
用到的jar包需要别人替我们准备好,或者可以到官网下载
- 不同技术的官网提供 jar 包下载的方式是不同的
- 有些技术的官网提供的下载方式就是 maven 的方式
- 如果在不“正规”的网站以不“正规”的方式进行下载,可能得到不“正规的文件”
- maven 可以以一种规范的方式下载 jar 包,目前几乎所有知名的以及非知名的框架或者第三方工具的jar包都按照统一的规范存在了 maven 的<font color=red>中央仓库</font>中
-
一个 jar 包依赖的其他的 jar 包需要一起导入到工程中,必须要求开发人员了解jar包之间的依赖关系,否则可能会发生<font color =red>冲突</font>
- FileUpload 组件依赖 IO 组件 Spring-Core 包依赖 IO 组件.
- maven 可以帮我们解决jar包依赖的问题:自动的将所依赖的jar包引用进来
Maven是什么
Maven是一款服务于Java平台的自动化构建工具
以 “java源文件” “框架的配置文件” “HTML/CSS/JS” "图片" “音视频” 等为“原材料”去生产一个可运行的项目的过程
-
构建过程的各个环节
- 清理:将以前编译得到的旧的 class 字节码文件删除
- 编译:将 Java 源文件编译成 .class 文件
- 测试:自动测试,自动调用 Junit 程序
- 报告:测试程序执行的结果
- 打包: 动态WEB工程打 war 包. Java工程打 jar 包
- 安装: Maven的特定概念:将打包得到的文件复制到仓库中的指定位置 (就可以供别人使用)
- 部署: 将动态WEB工程生成的war包复制到服务器(tomcat)的指定目录下,使其可以运行
安装 Maven
- 检查 Java 环境
- 在命令行中输入:
java -verion
-
下载 maven
-
将 Maven 解压到一个无中文无空格的路径下。(安装程序时,最好都无中文无空格)
- 我的解压到了
/usr/local/
目录下 tar zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/
- 我的解压到了
-
配置 maven 的环境变量
- 在
~/.bash_profile
(仅当前用户) 或者/etc/profile
(全局) 中进行配置
export M2_HOME=/usr/local/apache-maven-3.6.3
export PATH=* 保存退出以后记得 ```source ~/.bash_profile``` or ```source /etc/profile```
- 在
-
验证 Maven 是否安装成功
mvn -v
-
安装成功后的截图
Maven 的核心概念
- 约定的目录结构
- POM
- 坐标
- 仓库
- 依赖
- 生命周期 / 插件 / 目标
- 继承
- 聚合
Maven项目的目录结构
-
约定的目录结构
根目录:工程名 testjava
src目录:源码
pom.xml : Maven 工程的核心配置文件
main目录:存放主程序
test目录: 存放测试程序,测试用例
java目录:存放java源文件
resources目录:存放框架或者其他工具的配置文件
如图:
-
为什么要遵守约定的目录结构:
Maven 要负责项目的<font color = red>自动化构建</font>,以编译为例:Maven 要想自动进行编译,必须要知道 java 源文件存放在哪里。
-
如果我们想要定义一些配置想让框架或者其他工具知道
-
已配置的形式告诉框架
<para-value>classpath:applicationContext.xml</para-value>
-
遵守框架或者工具内部已经存在的约定
log4j.xml
log4j.properties
约定 > 配置 > 编码
-
常用的 Maven 命令
-
常用命令
mvn clean: 清理
mvn compile:编译主程序
mvn test-compile : 编译测试程序
mvn test:执行测试
mvn package:打包
mvn install :安装
mvn site :生成站点
mvn deploy : 部署
执行与构建过程相关的命令,必须进入pom.xml所在的目录下
联网问题
maven 的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成,而插件本身没有包含在maven的核心程序中。
当我们执行 maven 命令需要用到相关的插件时,Maven核心程序会首先到<font color=red>本地仓库</font>中查找
-
如果 maven 在本地仓库中找不到要用的插件,就会到中央仓库中去找,需要连接外网
maven会把jar包下载到本地仓库中
/Users/username/.m2/repository
如果无法连接外网,则构建失败
可以将所要用到的插件或是其他的 maven 工程提前下载好,存放到本地仓库中即可。
-
可以配置本地仓库的位置
- 在 maven 解压目录中找到 conf/settings/xml
<localRepository>/Users/username/RepMaven</localRepository>
POM
- 含义:Project Object Model 项目对象模型
- pom.xml 是maven 工程的核心配置文件,与构建过程相关的一切设置都在这个文件中配置
- 重要程度相当于 web.xml 对于动态 web 工程,applicationContext.xml 对于 spring 框架
坐标
-
数学中的坐标
- 在平面上:使用 x , y 两个向量可以唯一的定位平面中的任何一个点
- 在空间上:使用 x , y , z 三个向量可以唯一的定位空间中任何一个点
-
maven 中的坐标
-
maven也是通过三个向量定位仓库中的一个 maven 工程
-
groupId:公司或者组织的域名倒叙 + 项目名 (项目名可以随便取)
<groupId>com.xxx.maven</groupId>
-
artifactId:模块名 (一个项目可能有多个模块,即多个工程)
<artifactId>Hello</artifactId>
-
version:版本
<version>0.0.1-SNAPASH0T</version>
-
如何进行定位:
<dependency> <groupId>org.springframework<groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version>> <scope>compile</scope> </dependency>
eg :
org/springframework/spring-core/4.0.0.RELEASE/sprin-core-4.0.0.RELEASE.jar
(可以理解为路径)
-
-
仓库
-
仓库的分类
本地仓库:在当前电脑上部署的仓库目录,为当前电脑上所有的 Maven 工程服务
-
远程仓库:
- 私服(局域网仓库):搭建在局域网中,为局域网范围内的所有Maven工程服务
- 中央仓库:假设在internet上,为全世界所有 Maven 工程服务
- 中央仓库镜像: 为了分担中央仓库的流量,提升用户访问速度,在各个州假设的仓库
-
仓库中保存的内容
- Maven 自身所需要的插件
- 第三方框架或者工具的 jar 包
- 我们自己开发的 Maven 工程(安装)
-
解决下载仓库中的资源缓慢的问题
maven 默认的中央仓库架设在国外的服务器上,所以会导致下载缓慢的问题
可以修改配置文件中的镜像,设置为阿里云的镜像
-
修改 conf/settings.xml 文件,在mirros下添加如下配置
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror>
生命周期
各个构建环节执行的顺序,都是 Maven 预定设定好的,不能打乱该顺序,必须按照规定的正确的顺序来执行
Maven 的核心程序定义了抽象的生命周期,生命周期中各个阶段的具体任务由插件来完成
Maven 核心程序为了更好的实现自动化构建,按照这样的特定执行生命周期的各个阶段:不论现在要执行生命周期的哪一个阶段,都是从这个生命周期最初的位置开始执行
-
插件和目标
- 生命周期的各个阶段仅仅定义了要执行的任务是什么
- 各个阶段和插件的目标是对应的
- 相似的目标由特定的插件来完成
- 可以将目标看做是“调用插件的命令”
Maven在IDEA中的使用
-
创建普通的项目或者模块,然后在创建的项目(模块)上面添加maven的支持
- 创建模块
[图片上传失败...(image-87ce09-1601609755495)]
- 添加 maven 的依赖
-
修改idea中maven的配置
Preferences -> Build,Execution,Deployment -> Build Tools -> maven
修改 Maven home direcory , User settings file , Local repository
-
加入新的依赖,如junit
- 首先在pom.xml文件中添加junit的坐标,每一个依赖都被<dependency></dependency>包含,放在<dependencies></dependencies>下面 1⃣️
- 点击右边maven窗口的刷新按钮 2⃣️
- 可以看到已经引入了junit的依赖 3⃣️