Maven
1、为什么要学Maven
①现有技术栈已经可以开发完整的项目
②实际开发流程
结论:在实际发布项目的过程中,没有类似IDEA、Eclipse这样的图形化界面集成工具可以使用,只能在命令行环境下对项目的源代码进行“构建”操作。Maven就是在命令行环境下帮我们完成构建操作的。
2、什么是Maven
Maven是Apache软件基金会组织维护的一款构建和依赖管理工具。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HLN3agWL-1595665525850)(images/maven-logo-black-on-white.png)]在这里插入图片描述
①构建
构建其实是一个用原材料生产产品的过程。
- 原材料:Java源程序、图片、CSS样式文件、JavaScript脚本文件、框架配置文件。
- 产品:一个在服务器上可以运行的项目。
构建过程涉及到的主要环节:
- 清理:把上一次构建生成的结果删除,为下一次重新构建做好准备
- 编译:把Java源程序编译得到*.class字节码文件
- 测试:执行指定的测试程序,完成对项目特定点的功能测试
- 报告:测试的结果的格式化呈现
- 打包:Java工程生成jar包,Web工程生成war包
- 安装:就Maven而言,安装就是把上一步打包的结果保存到本地仓库
- 部署:把打包的结果放到服务器上
PS:构建过程的类比
生米→煮熟→熟饭
弹道导弹组件→组装→发射
②依赖
a.jar依赖b.jar时,说明a中用到了b中的类、资源文件等等。
例如:b.jar中声明了一个类Person。a.jar用到了Person
Person p = new Person();
p.getName();
在实际开发中,依赖是普遍存在的现象:
- 一个大型项目,用到多个不同框架进行开发时,会以依赖的形式引入大量jar包。
- jar包之间也大量存在错综复杂的依赖关系。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXAey1af-1595665525852)(images/img003.jpg)]
- 去哪下载jar包:官网找下载链接很难找,第三方网站提供的不规范
- 依赖过程中,有可能出现jar包冲突
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFwYCN5O-1595665525853)(images/img004.jpg)]
3、Maven工作机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCZljZuO-1595665525854)(images/img005.jpg)]
4、Maven安装和配置
①解压核心程序
把apache-maven-3.5.4-bin.zip解压到一个非中文没有空格的目录下。例如:D:\software\apache-maven-3.5.4
②配置环境变量
需要配置MAVEN_HOME和JAVA_HOME
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ycOKvWCy-1595665525855)(images/img006.jpg)]
需要PATH
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Nj50Zfx-1595665525856)(images/img007.jpg)]
③Maven本身配置
Maven核心配置文件位置:解压目录\conf\settings.xml,例如:
D:\software\apache-maven-3.5.4\conf\settings.xml
[1]修改本地仓库位置
<localRepository>D:/mvn-repository</localRepository>
[2]配置镜像仓库
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
注意:要把上面的mirror标签放在mirros标签里面。
[3]配置JDK版本
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
注意:上面的profile标签要放在profiles标签里面。
PS:XML语法
XML是extensible markup language的缩写,含义是可扩展标记语言。主要语法包括:
- 第一行必须是XML声明:<?xml version=“1.0” encoding=“UTF-8”?>
- 必须有一个唯一的根标签
- 每一个标签都必须正确关闭
- 双标签:<person>aaa</person>
- 单标签:<hello/>
- 标签里的每一个属性都必须有值,每个属性值都必须加引号(单引号、双引号都可以)
正确举例:
<person>
<hello>Hi!</hello>
<message school="agg"/>
</person>
错误举例:
<person>
<message school/>
④验证
执行mvn -v命令,看看能否出现Maven的版本信息。
C:\Users\Administrator>mvn -v
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: D:\software\apache-maven-3.5.4\bin\..
Java version: 1.8.0_111, vendor: Oracle Corporation, runtime: D:\software\java\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
5、在IDEA中使用Maven
①新建Maven工程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0nvVMq8-1595665525857)(images/img010.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nv4cxVEd-1595665525857)(images/img011.jpg)]
②在IDEA中配置Maven信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EjftcEd-1595665525858)(images/img012.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FEEiHn0Q-1595665525859)(images/img013.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7XKoaud-1595665525860)(images/img014.jpg)]
6、Maven核心概念:POM
①含义
POM:Project Object Model项目对象模型。
②思想
把现实生活中的事物抽象成模型,然后基于面向对象的思想,通过类和对象来描述这个模型,让程序通过操作类和对象管理现实生活中的数据,这样我们就可以使用代码解决现实生活中的问题了。
③对应
在Maven工程中,对应pom.xml配置文件。pom.xml配置文件是Maven工程的核心配置文件。
7、Maven核心概念:约定的目录结构
①各个目录的含义
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOavQoF0-1595665525860)(images/img015.jpg)]
②Maven规定各个目录作用的原因
Maven作为一款自动化构建工具,需要让构建过程尽可能自动化。就拿“编译”来说,Maven需要知道去哪读取源文件,执行编译,知道把编译结果存放在哪里。
③体现思想
约定>配置>编码
8、Maven核心概念:坐标
①数学坐标
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sBM1Rii4-1595665525861)(images/img016.jpg)]
数学中使用x、y、z三个“向量”可以在空间中唯一的定位一个点。
②Maven坐标
Maven使用下面三个向量
- groupid:用于定位一个公司或组织。习惯上会在公司或组织域名倒序的后面附加项目名称
- artifactid:用于定位一个模块
- version:指定当前Maven工程的版本
在Maven仓库中唯一的定位一个Maven工程(jar包)。例如:
<groupId>com.atguigu.maven</groupId>
<artifactId>maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
③坐标和本地仓库中目录结构的对应关系
例如:
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
这个坐标对应的仓库中的目录是:
Maven仓库根目录\commons-logging\commons-logging\1.1\commons-logging-1.1.jar
再比如:
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.9.RELEASE</version>
这个坐标对应的仓库中的目录是:
Maven仓库根目录\org\springframework\spring-aop\4.0.9.RELEASE\spring-aop-4.0.9.RELEASE.jar
要求:大家需要能够根据坐标信息到Maven仓库中找到jar包所在目录。
9、Maven核心概念:生命周期
Maven为了让构建过程能够自动化完成,设计了三个主要生命周期。
①Clean生命周期
与清理操作相关,包含三个主要环节
- pre-clean
- clean
- post-clean
②Site生命周期
与生成项目信息站点相关,包含四个主要环节
- pre-site
- site
- post-site
- deploy-site
③Default生命周期
这个生命周期中包含了主要的构建操作,是最重要的生命周期。
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如JAR。
pre-integration-test
integration-test
post-integration-test
verify
install将包安装至本地仓库,以让其它项目依赖。
deploy将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
④生命周期执行的特点
- 前面三个生命周期彼此是独立的。
- 在任何一个生命周期内部,执行任何一个具体环节的操作,都是从本周期最初的位置开始执行,直到指定的地方。(记住这句话就行了,前面的不需要记)
10、Maven核心概念:插件和目标
①插件
Maven的核心程序仅仅负责宏观调度,不做具体工作。具体工作都是由Maven插件完成的。例如:编译就是由maven-compiler-plugin-3.1.jar插件来执行的。
②目标
一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应。
Default生命周期中有compile和test-compile两个和编译相关的环节,这两个环节对应compile和test-compile两个目标,而这两个目标都是由maven-compiler-plugin-3.1.jar插件来执行的。
11、常用的Maven命令
①在命令行窗口执行Maven命令
注意:与构建相关的命令必须进入到pom.xml所在的目录才能执行。如果当前目录下没有pom.xml,会看到如下错误:
The goal you specified requires a project to execute but there is no POM in this directory (D:\stupid). Please verify you
invoked Maven from the correct directory.
- 清理mvn clean
- 编译mvn compile
- 测试mvn test
- 打包mvn package
- 安装mvn install
②IDEA中执行Maven构建命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNvytINe-1595665525862)(images/img017.jpg)]
12、在Maven中使用测试程序
①加入junit依赖
<!-- 以依赖的形式配置当前Maven工程所需要的jar包 -->
<dependencies>
<!-- 通过juni的坐标配置junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- scope标签配置的是依赖的范围 -->
<scope>test</scope>
</dependency>
</dependencies>
②在test/java目录下创建测试程序
package com.atguigu.maven.test;
import com.atguigu.maven.entity.Employee;
// 静态导入。表示Assert类中的静态资源导入到当前类,可以不写类名直接调用
import static org.junit.Assert.*;
import org.junit.Test;
public class MyTest {
@Test
public void testEmployee() {
Employee employee = new Employee();
employee.setEmpName("Tom");
String empNameActually = employee.getEmpName();
String empNameExpected = "I am Jerry";
// 断言
assertEquals(empNameExpected, empNameActually);
}
}
Assert类中的静态资源导入到当前类,可以不写类名直接调用
import static org.junit.Assert.*;
import org.junit.Test;
public class MyTest {
@Test
public void testEmployee() {
Employee employee = new Employee();
employee.setEmpName("Tom");
String empNameActually = employee.getEmpName();
String empNameExpected = "I am Jerry";
// 断言
assertEquals(empNameExpected, empNameActually);
}
}