Maven概述
1.1Maven是什么
目前主流的构建工具有Maven 和 Gradle
Maven 是 Apache 开源组织奉献的一个开源项目。Maven 这个词可以翻译为“知识的积累”,也可 以翻译为“专家”或“内行”。
本质
项目管理工具:将项目开发和管理过程抽相乘一个项目对象模型(POM)
Maven 是跨平台的,这意味着无论是在 Windows 上,还是在 Linux 或者 Mac 上,都可以使用同样的命令。
总结:
- Maven 统一集中管理好所有的依赖包,不需要程序员再去寻找。
- 项目中依赖的第三方组件,Maven 可以轻松解决重复和冲突问题。
- Maven 作为一个开放的架构,提供了公共接口,方便同第三方插件集成。程序员可以将自己需要 的插件,动态地集成到 Maven,从而扩展新的管理功能。
- Maven 可以统一每个项目的构建过程,实现不同项目的兼容性管理。
1.2构建
构建就是以我们编写的Java代码,框架配置文件,静态资源等作为原材料,去生产一个 可以运行的项目的过程。
- 主要环节
- 1.清理:将之前编译得到的旧的class 文件删除,为下一次编译做准备
- 2.编译:将java文件编译成字节码文件
- 3.测试:自动测试,自动调用Junit
- 4.报告:测试执行的结果
- 5.打包:动态Web工程打包成war包,不同Java工程jar包
- 6.安装:将打包得到的文件复制到仓库中的指定位置
- 7.部署:将war包打包赋值到服务器指定目录下
2.安装Maven
-
官方下载安装包,找到一个没有中文的目录解压
-
检查JAVA_HOME环境变量
-
解压Maven核心程序压缩包,复制到一个不包含中文的目录下
-
配置Maven环境变量与java类似
- MAVEN_HOME或M2_HOME
- path
3.cmd–>mvn - v查看Maven版本
3.Maven核心概念
1.约定的目录结构
2.POM
3.坐标
4.依赖
5.仓库
6.生命周期,插件,目标
7.继承
8.聚合
3.1第一个Maven工程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YtDGezUl-1617017070728)(C:\Users\dell\Pictures\java截图\Maven约定目录结构.png)]
src : 源码
**pom.xml :**Maven工程的核心配置文件
main : 存放主程序
test : 存放测试程序
java : Java源文件
resource : 存放框架或其他配置文件
接下来我们创建一个Maven的简单项目,用来熟悉一下maven
新建-Module-Maven-next
pom
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wdzl</groupId>
<artifactId>HelloMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
写一个类
package com.wdzl;
/**
* 第一个maven程序
*/
public class Hello{
public String sayHello(String info){
return "Hello "+info;
}
}
test
public class HelloTest{
@Test
public void test(){
Hello hello = new Hello();
String result = hello.sayHello("Maven");
/*
测试方法
*/
assertEquals("Hello Maven",result);
}
}
使用Maven命令执行编译运行
3.2常用命令
-
mvn compile:编译主程序
-
mvn clean:清理
-
mvn test-compile:编译测试程序
-
mvn test :执行测试
-
mvn package:打包
注意:
-
执行maven命令,必须进入pom.xml所再的目录
-
Maven工程所依赖的插件,并不包含再Maven核心程序中
- 当我们执行Maven命令,如果需要某些擦肩,Maven主程序首先会到本地仓库中寻找
- 本地仓库默认位置:c:\users\当前windows用户名\m2\repository
- 如果本地仓库找不到,就会联网取中央仓库中寻找,并下载到本地仓库中寻找
mvn compile
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IJoy4asZ-1617017070730)(C:\Users\dell\Pictures\java截图\mvn compile.png)]
mvn clean
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IFt0OSxa-1617017070731)(C:\Users\dell\Pictures\java截图\mvn clean.png)]
mvn test
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xaC4wo2r-1617017070732)(C:\Users\dell\Pictures\java截图\mvn test.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XVRciwnS-1617017070733)(C:\Users\dell\Pictures\java截图\mvn生成的包.png)]
3.3POM
**pom:**Project Object Model项目对象模型
pom.xml对于Maven工程,它是核心配置文件,与构建相关的所有配置都是再这个文件中配置,后期学习,也是围绕着这个文件
3.4坐标
1.在Maven中的坐标
a.:公司或阻止的域名倒序+项目名
<groupId>com.wdzl</groupId>
b.:模块名
<artifactId>HelloMaven</artifactId>
c.:版本号
<version>1.0-SNAPSHOT</version>
注意:
SNAPSHOT:不稳定版本或快照版本,表示该项目处于开发状态美穗饰可能发生变化
RELEASE:稳定版本或发布版本,一般项目上线后都会改为RELEASE版本
3.5仓库
1.分类
-
本地仓库:当前电脑上部署的Maven仓库,它是为当前电脑上的所有Maven工程服务的
-
远程仓库:
- 私服:搭建在局域网中,为局域网中的Maven工程服务的
- 中央仓库:架设在互联网上,为全球所有Maven工程服务
- 中央仓库镜像:为中央仓库分担访问压力,提高用户体验性
2.仓库里面保存的内容
- Maven自身所需的插件
- 第三方框架或工具的jar包
- 我们自己开发的Maven项目
3.6.依赖
讲解依赖之前,我们需要了解 SNAPSHOT 和 RELEASE 的区别
SNAPSHOT :不稳定版本 或 快照版本,表示该项目还处于开发状态,随时都可能发生变化,所以它是 不稳定版本。
RELEASE :代表稳定版本或发布版本,一般项目上线都会改为RELEASE 版本。
案例
1.创建与第一个Maven工程相同的目录结构
2.将第一个工程安装到Maven仓库中
3.编辑pom.xml,将第一个工程的依赖导入到当前项目中
?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"4. 编写测试案例
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SecondMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wdzl.maven</groupId>
<artifactId>FirstMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependen
\4. 编写测试案例
/**
* @author lp
* @version 1.0
*/
public class HelloMavenAgain {
public String sayHelloAgain() {
HelloMaven helloMaven = new HelloMaven();
String result = helloMaven.sayHello("Maven");
return result + " again";
}
}
/**
* @author lp
* @version 1.0
*/
public class HelloTest {
@Test
public void testHello() {
HelloMavenAgain again = new HelloMavenAgain();
String result = again.sayHelloAgain();
assertEquals("Hello Maven again",result);
}
常见依赖范围对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZIvlPByd-1617017070734)(C:\Users\dell\Pictures\java截图\常见依赖范围对比.png)]
-
compile依赖范围
-
主程序:有效
-
测试程序:有效
-
打包:参与
-
部署:参与
-
-
test依赖范围
- 主程序:无效
- 测试程序:有效
- 打包:不参与
-
provided依赖范围
- 主程序:有效
- 测试程序:有效 打包:
- 不参与 部署:不参与,原本的依赖由服务器提供
4.生命周期
这部分为纯理论,不需要死记硬背,理解即可。
在介绍 Maven之前,项目构建的生命周期概念就已经存在了。软件开发人员每天都要对项目进行 清理、编译、测试、打包以及安装部署。 虽然每个软件开发人员都做相关的事情,但公司和公司之间、项目和项目之间,往往目的一样,而 实现的形式各种各样。有的项目基于 IDE 工具完成编译、打包和发布,比如 MyEclipse 和 Eclipse Java EE;有些是软件开发人员自己编写脚本,对项目进行自定义构件,比如 ant 脚本。 这些都是具有个性化和针对性的,到下一个项目后,又需要改造成新项目所需要的形式。因此就产 生了一个问题:感觉是一样的,又不能重用,所以必须重写。 学习、分析、反思和总结以前工作中对项目的构建过程,Maven 抽象出了一个适合于所有项目的 构建生命周期,并将它们统一规范。 具体步骤包括
-
清理、
-
初始化、
-
编译、
-
测试、
-
打包、
-
集成测试、
-
验证、
-
部署
-
生成站点
这些步骤几 乎适合所有的项目,也就是说,所有项目的管理构建过程都可以对应到这个生命周期上来。 需要注意的是,Maven 中项目的构建生命周期只是 Maven 根据实际情况抽象提炼出来的一个统一 标准和规范,是不能做具体事情的。也就是说,Maven 没有提供一个编译器能在编译阶段编译源代 码。 既然 Maven 不做具体事情,那具体事情由谁做呢?
好的思想、创意,最终都需要在做具体事情的 实践中执行才有结果。 所以 Maven 只是规定了生命周期的各个阶段和步骤,具体事情,由集成到 Maven 中的插件完 成。比如前面介绍的生成站点,就是由 maven-site-plugin 插件完成的。 Maven 在项目的构建过程中,只是在方向和步骤上面起到了管理和协调的作用。 Maven 在生命周期的每个阶段都设计了插件接口。用户可以在接口上根据项目的实际需要绑定第 三方的插件,做该阶段应该完成的任务,从而保证所有 Maven 项目构建过程的标准化。当然,Maven 对大多数构建阶段绑定了默认的插件,通过这样的默认绑定,又简化和稳定了实际项目的构建。 在执行编译前,我们需要清理旧的内容,清理完成后才能执行编译,编译后要进行测试,生成报告,报 告没有问题才能打包和安装,部署。 所以:各个构建环节顺序必须按照给定的顺序来执行,并且都依赖 于特定的插件。
4.1 Maven的三个生命周期
Maven中有三个相互独立的生命周期,分别是:
①Clean Lifecycle:在进行项目构建前进行的一些清理工作
②Default Lifecycle:构建的核心部分,如编译,测试,打包,安装,部署等。
③Site Lifecycle: 生成项目报告,发布站点等
4.2Clean生命周期
- pre-clean:执行一些需要在clean之前完成的工作
- clean:删除上一次构建生成的文件
- post-clean:执行一些需要在clean之后完成的工作
4.3 Default生命周期
\1. validate:验证,验证项目是否正确且所有必须信息是可用的
- compile:编译,源代码编译在此阶段完成
- Test:测试,使用适当的单元测试框架进行测试,例如JUnit。
- package:打包,创建jar包 或 war包
- verify:检查,对集成测试的结果进行检查,以保证质量达标
- install:安装,安装打包的项目到本地仓库,以供其他程序使用
- deploy:部署,拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
5.在IDEA中安装Maven
1.配置Maven
在setting中的maven
Maven home directory: maven的安装目录
User settings file:Maven安装目录conf/settings.xml配置文件
Local repository: Maven本地仓库的目录位置
2.配置Maven环境(在Setting中的Runner)
VM Options:-DarchetypeCatalog=internal -DarchetypeCatalog=internal
- maven :Maven项目在创建时,会联网下载模板文件
- -DarchetypeCatalog=internal :Maven项目创建时,不下载模板文件,创建速度会提高
JRE:选择JDK6以上版本
3.创建Maven工程
1.创建一个空项目
2.创建module
Create from archetype:是创建module使用模板的意思,勾选后可以选择你想创建的模板
- maven-archetype-quickstart : 普通的java项目
- maven-archetype-webapp : web工程
4.IDEA中使用Maven命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UOmtT5pO-1617017070735)(C:\Users\dell\Pictures\java截图\在IDEA中使用Maven命令.png)]
6.依赖关系
通过快捷键:
Alt + Ctrl +Shift + U 调出 Maven项目依赖关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J6V405ll-1617017070736)(C:\Users\dell\Pictures\java截图\依赖关系.png)]
排除依赖
在实际开发中,我们经常会遇到Maven依赖冲突的问题,导致编译时报一些异常,处理依赖冲突问题, 我们可以解除依赖排除。这里我们提供两种方式,第一种是图形化界面操作,第二种是手动添加依赖排 除
\1. 通过IDEA添加依赖排除
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b7LnWATu-1617017070736)(C:\Users\dell\Pictures\java截图\依赖排除.png)]
\2手动删除依赖
直接通过代码删除
依赖原则
- 就近原则
工程
4.IDEA中使用Maven命令
[外链图片转存中…(img-UOmtT5pO-1617017070735)]
6.依赖关系
通过快捷键:
Alt + Ctrl +Shift + U 调出 Maven项目依赖关系
[外链图片转存中…(img-J6V405ll-1617017070736)]
排除依赖
在实际开发中,我们经常会遇到Maven依赖冲突的问题,导致编译时报一些异常,处理依赖冲突问题, 我们可以解除依赖排除。这里我们提供两种方式,第一种是图形化界面操作,第二种是手动添加依赖排 除
\1. 通过IDEA添加依赖排除
[外链图片转存中…(img-b7LnWATu-1617017070736)]
\2手动删除依赖
直接通过代码删除
依赖原则
- 就近原则
- 先到先得原则