Maven基础
1、Maven能够做什么
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
- 提供了一套标准化的项目结构
- 提供了一套标准化的构建流程(编译,测试,打包,发布……)
- 提供了一套依赖管理机制
1、标准化的项目结构
Maven提供了一套标准化的项目结构,所有IDE使用Maven构建的项目结构完全一样,所有IDE创建的Maven项目可以通用。
各目录存放资源类型说明:
src/main/java:项目java源码
src/main/resources:项目的相关配置文件(比如mybatis配置,xml映射配置,自定义配置文件等)
src/main/webapp:web资源(比如html,css,js等)
src/test/java:测试代码
src/test/resources:测试相关配置文件
pom.xml:项目pom文件
2、标准化的构建流程
Maven提供了一套简单的命令来完成项目构建。
我们开发的每个项目都要经过编译、测试、打包、发布等标准的构建流程,而Maven实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。简单来理解,也就是说Maven提供了一套简单的命令来完成这些工作。
3、依赖管理机制
依赖管理其实就是管理你项目所依赖的第三方资源 (jar包、插件…)。
在我们的项目开发中,不可避免的需要使用到一些第三方的jar包。例如,链接数据库的JDBC相关jar包,单元测试的JUnit相关jar包,记录日志的Log4J相关jar包等等。之前手动导入jar包需要:
1.下载 jar 包
2.复制 jar 包到项目
3.将 jar 包加入工作环境
而且,在项目技术升级时,如果涉及到的某个jar包需要升级版本,那么还需要自己调整。并且某个技术很可能还依赖其他的技术,那么相关的的依赖jar包也需要调整版本。这样就会大大增加我们项目的维护成本。
而Maven使用标准的坐标配置来管理各种依赖,只需要简单的配置就可以完成依赖管理。
2、Maven简介
Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。
Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
Maven是用Java语言编写的。他管理的东西统统以面向对象的形式进行设计,最终他把一个项目看成一个对象,而这个对象叫做POM(project object model),即项目对象模型。
1、其中的构建生命周期/阶段,指的就是maven构建项目的各种命令。例如:编译、测试、打包、发布等。当然它的这些功能需要使用一些相关的插件来完成,整个生命周期过程中插件是需要配合使用的,单独一个无法完成完整的生命周期。
2、Maven需要编写一个核心的pom.xml文件,Maven通过加载这个配置文件就可以知道我们项目的相关信息了。
3、那Maven是如何帮我们进行项目资源管理的呢?这就需要用到Maven中的第二个东西:依赖管理。这也是它的第二个核心!
所谓依赖管理就是maven对项目所有依赖资源的一种管理,它和项目之间是一种双向关系,即当我们做项目的时候maven的依赖管理可以帮助你去管理你所需要的其他资源,当其他的项目需要依赖我们项目的时候,maven也会把我们的项目当作一种资源去进行管理,这就是一种双向关系。
maven的依赖管理所管理的资源主要有三个位置:本地仓库,远程仓库(私服),中央仓库。
-
本地仓库:自己计算机上的一个目录
-
中央仓库:由Maven团队维护的全球唯一的仓库
- 远程仓库(私服):一般由公司团队搭建的私有仓库
当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:
-
如果有,则在项目直接引用;
- 如果没有,则去中央仓库中下载对应的jar包到本地仓库。
还可以搭建远程仓库,将来jar包的查找顺序则变为:
- 本地仓库 --> 远程仓库 --> 中央仓库
通常,在创建项目初期,会由公司去搭建一个远程仓库(私服),将中央仓库中的jar包同步到远程仓库。一方面提高访问的速度;另一方面,中央仓库中存放的都是一些开源的技术jar包;如果有版权信息的技术jar包,也只能存放于远程仓库中。
3、Maven的安装和配置
1.在maven官网下载,解压 apache-maven-3.6.1.rar 即安装完成。
bin:可执行程序目录
boot:maven自身的启动加载器
conf:maven配置文件的存放目录
lib:maven运行所需库的存放目录
2.配置环境变量 MAVEN_HOME 为安装路径的bin目录
3.配置本地仓库:修改 conf/settings.xml 中的 <localRepository>
为一个指定目录
<!-- 配置本地仓库,其中的路径需要自定义 -->
<localRepository>C:/DevelopProgram/apache-maven-3.6.2/repository</localRepository>
4.配置阿里云私服:修改 conf/settings.xml 中的 <mirrors>
标签,为其添加如下子标签:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
maven默认连接的远程仓库是中央仓库。此配置的作用是将远程仓库配置为阿里云私服,提高下载速度。
4、Maven的基本使用
4.1、Maven 常用命令
mvn compile :编译 -- 编译项目的源代码
mvn clean:清理 -- 移除上一次构建产生的所有文件
mvn test:测试 -- 使用合适的测试框架运行测试
mvn package:打包 -- 将编译后的代码打包成可分发格式的文件,比如:jar、war或者ear文件。
mvn install:安装 -- 安装项目包到本地仓库,这样当前项目就可以作为其他本地项目的依赖。
4.1.1 手动搭建maven项目
我们先使用手动的方式来创建maven项目
(1)在D盘下创建目录mvnproject
并进入该目录,作为我们的操作目录
(2)创建我们的maven项目,创建一个目录project-java
作为我们的项目文件夹,并进入到该目录
(3)创建java代码(源代码)所在目录,即创建src/main/java
(4)创建配置文件所在目录,即创建src/main/resources
(5)创建测试源代码所在目录,即创建src/test/java
(6)创建测试存放配置文件存放目录,即src/test/resources
(7)在src/main/java
中创建一个包(注意在windows文件夹下就是创建目录)com/hainiuxy
,在该目录下创建Demo.java
文件,作为演示所需java程序,内容如下
package com.hainiuxy;
public class Demo{
public String say(String name){
System.out.println("hello "+name);
return "hello "+name;
}
}
(8)在src/test/java
中创建一个测试包(目录)com/hainiuxy
,在该包下创建测试程序DemoTest.java
package com.hainiuxy;
import org.junit.*;
public class DemoTest{
@Test
public void testSay(){
Demo d = new Demo();
String ret = d.say("maven");
Assert.assertEquals("hello maven",ret);
}
}
(9)在project-java
下创建pom.xml
文件,编辑如下
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hainiuxy</groupId>
<artifactId>project-java</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
4.2.4 测试命令
(1)在项目project-java
目录所在的DOS命令窗口下执行mvn compile
进行源码编译,当然首次执行需要先下载相关插件
编辑结果如下:
编译完成后在项目project-java
下多了一个目录target
,在这个目录下就存放的是maven编译好的一些东西
我们可以进入到target
目录查看
其中生成的classes
目录就是编译好的字节码文件
(2)当然如果我们想清理掉这些东西,我们只需执行mvn clean
命令即可,清理掉后target
目录也就消失了
(3)如果我们要执行测试包中的测试程序,我们只需执行mvn test
命令即可
此时在看target
目录会多一些东西
其中产生的test-classes
就是测试代码的字节码文件,surefire-reports
是它产生的测试报告
(4)使用mvn package
命令进行打包,如下
在生成的target
目录中可以看到打包的结果
当然,如果仔细看DOS窗口输出的我们会发现,mvn package
命令的时候maven会把前面两个命令mvn compile,mvn test
都执行一遍
(5)使用mvn install
命令进行安装,将项目打好的包存入本地仓库
仔细查看输出会发现
mvn install
命令执行的时候也会将前面的命令都执行一遍
此时我们可以去本地仓库中查找
maven是按照groupId/artifactId/version
的结构在本地仓库进行存储
4.2、Maven 生命周期
maven的构建生命周期描述的是一次构建过程经历了多少个事件
比如我们项目最常用的一套流程如下:
当然maven的生命周期不止这一套,总共分为3套,每套里面包含的事件如下
(1)clean:清理工作
pre-clean:执行一些在clean之前的工作
clean:移除上一次构建产生的所有文件
post-clean:执行一些在clean之后立刻完成的工作
(2)default:核心工作,例如编译,测试,打包,部署等
这里面的事件非常的多,如下图
对于default生命周期,每个事件在执行之前都会将之前的所有事件依次执行一遍。
(3)site:产生报告,发布站点等
pre-site:执行一些在生成站点文档之前的工作
site:生成项目的站点文档
post-site:执行一些在生成站点文档之后完成的工作,为部署做准备
site-deploy:将生成的站点文档部署到特定的服务器上
5、idea配置maven
5.1、在idea中设置maven
选择File -- Settings,搜索maven,在右侧设置栏中修改:
Maven home directory: maven的本地安装目录
User settings file: 选择maven安装目录\conf\下的settings.xml文件
Local repository: 会自动调整为配置文件中配置的本地仓库地址
5.2、Maven坐标
maven中的坐标用于描述仓库中资源的位置。
- Maven 中的坐标是资源的唯一标识
- 使用坐标来定义项目或引入项目中需要的依赖
maven坐标的主要组成如下:
groupId:定义当前资源隶属组织名称(通常是域名反写,如:org.mybatis;com.hainiuxy)
artifactId:定义当前资源的名称(通常是项目或模块名称,如:crm,sms,oa)
version:定义当前资源的版本号
packaging:定义资源的打包方式,取值一般有如下三种
(1)jar:该资源打成jar包,默认是jar
(2)war:该资源打成war包
(3)pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个pom.xml不生成jar或其他包结构
5.3、在idea中创建maven项目
1.创建模块,选择Maven,点击Next
2.填写模块名称,坐标信息,点击finish,创建完成
3.编写 HelloWorld,并运行
5.4、在idea中导入maven项目
1.选择右侧Maven面板,点击 + 号
2.选中对应项目的pom.xml文件,双击即可
3.如果没有Maven面板,选择
View -- Appearance -- Tool Window Bars
5.5、配置maven-helper插件
1.选择 IDEA中 File --> Settings
2.选择 Plugins
3.搜索 Maven,选择第一个 Maven Helper,点击Install安装,弹出面板中点击Accept
4.重启 IDEA
6、Maven依赖管理
6.1、依赖配置
6.1.1、使用坐标导入jar包
1.在 pom.xml 中编写 标签
2.在 标签中 使用 引入坐标
3.定义坐标的 groupId,artifactId,version
4.点击刷新按钮,使坐标生效
依赖是指在当前项目中运行所需的jar,依赖配置的格式如下图
6.1.2、查找资源的坐标
如果要查询maven某一个资源的坐标,我们通常可以去maven的仓库进行查询,
https://mvnrepository.com/,在该网站中可直接搜索想要的资源,然后就能得到该资源的坐标
输入资源名称进行检索
点击你想要的资源进行查看
选择版本查看坐标
6.1.3、 使用坐标导入jar包 -- 快捷方式
1.在 pom.xml 中 按 alt + insert,选择 Dependency
2.在弹出的面板中搜索对应坐标,然后双击选中对应坐标
3.点击刷新按钮,使坐标生效
备注:此方式需要保证本地仓库中已经存在该jar包
6.2、依赖传递
依赖具有传递性。
直接依赖:在当前项目中通过依赖配置建立的依赖关系。
间接依赖:被依赖的资源如果也同时依赖其他资源,当前项目间接依赖其他资源。
依赖传递中的冲突问题
路径优先:当依赖中出现相同的资源时,层级越深,优先级越低。
声明优先:当资源在相同层级被依赖时,配置顺序靠前的依赖覆盖配置顺序靠后的依赖。
6.3、可选依赖
可选依赖指的是对外隐藏当前所依赖的资源。
6.4、排除依赖
排除依赖指主动断开依赖的资源。
6.5、 依赖范围
依赖的jar默认情况可以在任何地方可用,可以通过scope
标签设定其作用范围
这里的范围主要是指以下三种范围
(1)主程序范围有效(src/main目录范围内)
(2)测试程序范围内有效(src/test目录范围内)
(3)是否参与打包(package指令范围内)
此外:scope
标签的取值有四种:compile,test,provided,runtime
这四种取值与范围的对应情况如下:
依赖范围的传递性: