一,Maven概述
Maven作为一个构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供了一致的操作接口,这一切足以使它成为优秀的、流行的构建工具。
Maven不仅是构建工具,还是一个依赖管理工具和项目管理工具,它提供了中央仓库,能帮我自动下载第三方jar包。
Maven项目的核心是pom.xml文件,POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,一个pom.xml文件就代表一个项目。
Maven的关系图:
Maven的作用:
-
项目构建:提供了标准的,跨平台的自动化项目构建方式
-
依赖管理:发表快捷的管理项目依赖的jar包,避免jar包之间的版本冲突问题。
-
统一开发结构:提供标准的,统一的项目结构。
Maven的统一java项目图:
二,Maven安装与配置
Maven是一个绿色软件,可以直接解压压缩包安装。
Maven下载地址:Maven – Welcome to Apache Maven
如下图:
- Linux版本下载bin.tar.gz结尾的
- Windows版本下载bin.zip结尾的
Maven文件夹说明:
Maven环境变量配置:
-
Maven依赖java,需要JAVA_HOME已经配置好。
-
配置MAVEN_HOME,值是maven的安装路径
-
配置path,填入:
%MAVEN_HOME%\bin-
在cmd中使用
mvn来测试是否配置成功。配置成功效果如下图:
-
Maven本地仓库配置
在Maven安装路径中的conf文件夹中的settings.xml文件中编辑
-
Maven配置阿里源(这一步相当于配置私服,阿里云给的私服,因为默认的中央仓库是国外仓库)
<!-- 阿里云仓库 --> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror> -
Maven配置jdk
<!-- java jdk1.8版本 --> <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>
-
三,Maven基础概念
3.1 仓库
仓库:用于存储资源,包含各种jar包。
仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源。
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源。
- 中央仓库:Maven团队维护,存储了所有。
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取。
私服的作用:
- 保护具有版权的资源,包含购买或自主研发的jar包。
- 一定范围内共享资源,仅对内部开放,不对外共享。
3.2 坐标
坐标:Maven中用于描述仓库中资源的位置。
Maven坐标的主要组成:
-
groupId:定义当前Maven项目隶属组织名(通常为域名反写)
-
artifactId:定义当前Maven项目名(通常是模块名)
-
version:定义当前项目版本号
- release代表完成版
- snapshot代表开发版
-
packaging:定义打包方式
- web工程打包为war包
- java工程打包为jar包
Maven坐标如下:
<!--maven项目的组织id-->
<groupId>com.normaling</groupId>
<!--maven项目名-->
<artifactId>Main</artifactId>
<!--maven项目版本-->
<version>0.0.1-SNAPSHOT</version>
<!--名字,可不写-->
<name>Main</name>
<!--描述,可不写-->
<description>Main</description>
Maven坐标的作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交给机器完成。
maven坐标查找资源可以通过Maven Repository
3.3 Maven项目目录结构
Maven项目目录结构如下:
src:
-
main:-
java: 该目录是项目的主要源代码目录。所有Java源代码都应该放在这里。Maven会将这些源代码编译为项目的主要类文件。在java文件夹中,采用src/main/java/com/example:Java代码通常按照包的结构组织,这里使用的是一个示例包名。
-
resources: 在这个目录下,你可以放置项目的主要资源文件,如配置文件、属性文件、XML文件等。这些文件会被打包到项目的输出文件中,使其在运行时可用。static:用于存放Web应用程序的静态资源,如图片、样式表等。templates:用于存放Web应用程序的模板文件,如Thymeleaf或Freemarker模板。
-
webapp: 如果项目是一个Web应用程序,这个目录是存放Web应用程序的根目录。在这里,你可以放置Web应用程序的静态资源,如HTML、CSS、JavaScript文件以及WEB-INF目录和web.xml文件。
-
-
test:java: 该目录是用于编写项目的单元测试代码。在这里,你可以编写各种针对项目代码的测试用例。Maven会在构建过程中执行这些测试。resources: 与src/main/resources类似,这里是放置测试所需的资源文件。例如,如果你的测试需要读取一个测试数据文件,可以将它放在这个目录中。
-
target: 这个目录是Maven构建过程的输出目录。所有的构建结果,包括编译后的类文件、打包后的JAR或WAR文件,都会被放在这个目录下。
pom.xml: 这个文件是Maven项目的核心文件,称为"Project Object Model"(项目对象模型)。它描述了项目的依赖关系、构建配置、插件等信息。在pom.xml中定义的信息可以让Maven自动管理项目的构建和依赖。
3.4 Maven项目构建命令
Maven构建命令使用mvn开头,后面添加功能参数,可以一次性执行多个命令,使用空格分隔。
mvn compile #编译
mvn clean #清理maven项目编译后的文件
mvn test #测试当前maven项目,就是执行test目录下的代码
mvn package #将maven项目打包
mvn install #将maven项目安装到本地仓库
四,Maven依赖管理
4.1 依赖配置
依赖:指的是当前项目运行所需要的jar包,一个项目可以设置多个依赖。
格式:
<!--xml文件固定头-->
<?xml version="1.0" encoding="UTF-8"?>
<!--xml文件的schema约束的引入-->
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--当前maven模块版本,不需要改,固定格式-->
<modelVersion>4.0.0</modelVersion>
<properties>
<!--当前maven项目的jdk版本-->
<java.version>11</java.version>
</properties>
<!--依赖设置-->
<dependencies>
<!--具体的依赖-->
<dependency>
<!--依赖所属组织id-->
<groupId></groupId>
<!--依赖所属项目id-->
<artifactId></artifactId>
<!--依赖版本-->
<version></version>
</dependency>
</dependencies>
</project>
4.2 依赖传递
依赖具有传递性,分为:
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
- 间接依赖:被资源的资源方通过依赖其他资源,则当前项目间接依赖其他资源。
在配置依赖的时候会存在版本不同等问题导致的依赖冲突问题,maven根据如下策略来解决:
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
可选依赖:指对外隐藏当前所依赖的资源不透明,隐藏后不具有依赖的传递性
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<optional>true</optional><!--true就代表开启可选依赖,默认false-->
</dependency>
排除依赖: 指主动断开依赖的资源,被排除的资源无需指定版本。
比如说项目A依赖了项目B,项目B依赖了项目C,项目A如果不需要项目C,就排除项目C这个依赖
即A---depend-->B-----depend---->C变成A----depend--->B
就在A的pom.xml文件中写下要排除的依赖坐标。
<dependency>
<exclusions>
<exclusion>
<!--要排除的指定依赖坐标,不需要指定版本-->
</exclusion>
</exclusions>
</dependency>
4.3 依赖范围
在配置依赖的坐标中有一个scope标签用来配置依赖的作用范围
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope></scope>
</dependency>
依赖的作用范围分为三种:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围内有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
scope的四个值对应依赖作用范围如下图所示:
带有依赖范围的资源在进行依赖传递时,依赖的作用范围会收到影响,如下图所示:
五,Maven的生命周期与插件
5.1 Maven生命周期
Maven构建生命周期描述的是一次构建过程经历经历了多少个事件。
Maven对项目构建的生命周期划分为3套:
- clean:清理工作
- default:核心工作,例如编译,测试,打包,部署等。
- site:产生报告,发布站点等。
clean生命周期
-
pre-clean:执行一些需要在clean之前完成的工作
-
clean:移除所有上一次构建生成的文件
-
post-clean:执行一些需要在clean之后立刻完成的工作
default构建生命周期
-
validate (校验):校验项目是否正确并且所有必要的信息可以完成项目的构建过程
-
initialize (初始化):初始化构建状态,比如设置属性值.
-
generate-sources(生成源代码):生成包含在编译阶段中的任何源代码
-
process-sources(处理源代码):处理源代码,比如说,过滤任意值。
-
generate-resources (生成资源文件):生成将会包合在项目包中的资源文件
-
process-resources (处理资源文件):复制和处理资源到目标目录,为打包阶段最好准备。
-
compile (编译):编译项目的源代码。
-
process-classes(处理类文件):处理编译生成的文件,比如说对Java class文件做字节码改善优化
-
generate-test-sources (生成测试源代码):生成包含在编译阶段中的任何测试源代码
-
process-test-sources (处理测试源代码):处理测试源代码,比如说,过滤任意值.
-
generate-test-resources (生成测试资源文件):为测试创建资源文件。
-
process-test-resources (处理测试资源文件):复制和处理测试资源到目标目录
-
test-compile (编译测试源码):编译测试源代码到测试目标目录
-
process-test-classes (处理测试类文件):处理测试源码编译生成的文件。
-
test(测试):使用合适的单元测试框架运行测试(Juint是其中之一)。
-
prepare-package(准备打包):在实际打包之前,执行任何的必要的操作为打包做准备。
-
package(打包):将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件
-
pre-integration-test (集成测试前):在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
-
integration-test(集成测试):处理和部署项目到可以运行集成测试环境中。
-
post-integration-test (集成测试后):在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境
-
verify:运行任意的检查来验证项目包有效且达到质量标准
-
install (安装):安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖
-
deploy(部署):将最终的项目包复制到远程仓库中与其他开发者和项目共享
site构建生命周期
- pre-site: 执行一些需要在生成站点文档之前完成的工作
- site: 生成项目的站点文档
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy: 将生成的站点文档部署到特定的服务器上,即将你的jar包发布到你设置好的maven私服之中。
Maven的生命周期假设执行了test阶段,那么会从validate阶段开始一直到test阶段都执行一次。
5.2 Maven的插件
插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能
即通过插件完成对应生命周期所需要完成的事情。
举例:导入source插件将源代码打包为jar包
<plugin>
<!--插件的坐标,具体看maven官网-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
<!--插件是如何执行的-->
<executions>
<!--插件具体执行内容-->
<execution>
<!--插件在具体某个生命周期中执行-->
<phase>generate-resources</phase>
<!--不是每一个插件都有这个功能,这里是指代打包为jar包-->
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
插件的具体用法直接查找maven官网即可。