一、理解什么是Maven
1.1、简介
1.1.1、何为maven
Maven就是是专门为Java项目打造的管理和构建工具
它的主要功能有:
- 提供了一套标准化的项目结构
- 提供了一套标准化的构建流程(编译,测试,打包,发布……)
- 提供了一套依赖管理机制
1.1.2、为何引入Maven
【总结】
1、
方便项目的构建
(支持多种任务,比如校验、编译、测试、打包、部署、发布…)2、
方便依赖管理
(直接在pom.xml文件下配置即可,很方便排查依赖冲突问题,并且提供了Maven仓库,让依赖获取非常方便快捷)3、
项目信息管理
(开发者信息,版本等等均可在pom.xml中配置)
如果没有Maven,你可能不得不经历下面的过程:
1、如果使用了spring,去spring的官网下载jar包;如果使用hibernate,去hibernate的官网下载Jar包;如果使用Log4j,去log4j的官网 下载jar包…
2、当某些jar包有依赖的时候,还要去下载对应的依赖jar包
3、当jar包依赖有冲突时,不得不一个一个的排查
4、执行构建时,需要使用ant写出很多重复的任务代码
5、当新人加入开发时,需要拷贝大量的jar包,然后重复进行构建
6、当进行测试时,需要一个一个的运行…检查
有了Maven,它提供了三种功能:
1、依赖的管理:仅仅通过jar包的几个属性,就能确定唯一的jar包,在指定的文件pom.xml中,只要写入这些依赖属性,就会自动下载并管理jar包。
2、项目的构建:内置很多的插件与生命周期,支持多种任务,比如校验、编译、测试、打包、部署、发布…
3、项目的知识管理:管理项目相关的其他内容,比如开发者信息,版本等等
1.1.3、Maven项目
-
Maven项目层级
一个使用Maven管理的普通的Java项目,它的目录结构默认如下:
a-maven-project ├── pom.xml # 依赖、项目信息配置 ├── src │ ├── main │ │ ├── java # Java源码的目录 │ │ └── resources # 存放资源文件的目录 │ └── test │ ├── java │ └── resources └── target # 存放所有编译、打包生成的文件
复制 -
pom.xml文件
【groupId、artifactId、version】
groupId
类似于Java的包名,通常是公司或组织名称artifactId
类似于Java的类名,通常是项目名称,再加上version
一个Maven工程就是由
groupId
,artifactId
和version
作为唯一标识。我们在引用其他第三方库的时候,也是通过这3个变量确定。比如下面的commons-logging【dependency、properties】
使用
<dependency>
声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。<properties>
可以全局配置依赖的版本号<project ...> <modelVersion>4.0.0</modelVersion> <groupId>com.itranswarp.learnjava</groupId> <artifactId>hello</artifactId> <version>1.0</version> <packaging>jar</packaging> <properties> <mybatis-plus-generator.version>3.5.3</mybatis-plus-generator.version> </properties> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies> </project>
复制
1.2、仓库
存储依赖jar包的仓库
1.2.1、仓库分类
Maven仓库分为:本地仓库、远程仓库
当我们拉取依赖时,会先去本地仓库寻找,没有再去远程仓库寻找
-
本地仓库
本地仓库主要起缓存作用,默认在
~/.m2/repository
。可以通过
~/.m2/settings.xml
中的<localRepository>
修改。 -
远程仓库
远程仓库包括:Maven的中央仓库、公共仓库、个人搭建的私有仓库
1.2.2、快照版本
-
什么是快照版本?
我们在发布版本时会标识版本比如:2.1、2.2
但是,如果依赖A、B同时迭代,B需要依赖A,那么A需要及时的给出最新给B使用。
而A如果每次迭代的非正式版本都是2.1,那么,因为版本号没变,B的开发者的A依赖一直从本地仓库拉取(不变),想要最新版的,
每次要清空本地仓库
A如果每次迭代的非正式版本都用一个新的,比如2.1、2.2…这样会有很多版本,不利于维护
因此,可以使用快照版本,比如2.1-SNAPSHOT,Maven会
自动的打上时间戳
,比如2.1-20221019,所以即使每次提交都是2.1-SNAPSHOT版本,B在使用A时,刷新一下本地仓库就能获得A的最新依赖。 -
快照版本作用?
用于非正式版本的发布
-
什么样的是快照版本?
快照版本使用SNAPSHOT标识,比如:2.1-SNAPSHOT
1.2.3、镜像
-
什么是镜像?
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像
-
有什么作用
有些仓库在国内访问速度较慢,因此会出现一些镜像仓库,如阿里云等
<!-- 修改maven的settings.xml 文件 --> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
复制
1.3、生命周期
1.3.1、生命周期
Maven 构建生命周期就是 Maven 将一个整体任务划分为一个个的阶段,类似于流程图,按顺序依次执行。也可以指定该任务执行到中间的某个阶段结束。
Maven 有以下三个标准的生命周期:
- clean:项目清理的处理
- default(或 build):项目部署的处理
- site:项目站点文档创建的处理
其中 default 生命周期的核心阶段如下所示:
阶段 | 处理 | 描述 |
---|---|---|
验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
编译 compile | 执行编译 | 源代码编译在此阶段完成 |
测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
1.3.2、生命周期的应用
- 可以指定某个生命周期的阶段
执行 mvn install 命令,将完成 validate, compile, test, package, verify, install 阶段,并将 package 生成的包发布到本地仓库中。其中某些带有连字符的阶段不能通过 shell 命令单独指定。
mvn install
复制
- 可以指定多个不同构建生命周期的阶段
执行 mvn clean deploy 命令,首先完成的 clean lifecycle,将以前构建的文件清理,然后再执行 default lifecycle 的 validate, compile, test, package, verify, insstall, deploy 阶段,将 package 阶段创建的包发布到远程仓库中。
mvn clean deploy
复制
二、使用Maven
2.1、安装maven
2.1.1、安装maven
由于 JDK 是 Maven 安装的前置条件,所以请使用 java -version
确认是否已经安装了 JDK
-
brew一键安装
# 安装 brew install maven # 查看版本、安装位置 mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: /Users/xxx/maven/apache-maven-3.6.3 Java version: 1.8.0_261, vendor: Oracle Corporation, runtime: /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home Default locale: zh_CN, platform encoding: UTF-8 OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"
复制
2.1.2、IDEA配置Maven
【User settings file】:Maven配置文件
【Local repository】:Maven本地仓库
默认会放在~/.m2/repository目录下 ("~"代表用户的目录)
可以在自己的maven目录下新建repo目录,然后指定该目录,当maven compiler时,maven依赖的jar包会放到该目录下
2.2、实践
2.2.1、如何找到maven的setting.xml文件
-
位置1:用户家目录(默认生效位置)
maven默认会在(用户家目录)/.m2/settings.xml放置,IDEA没有自定义的话,默认是使用这个位置的配置
mac下可以
vi ~/.m2/settings.xml
修改 -
位置2:maven安装目录
maven安装目录也有:(maven安装目录)/.m2/settings.xml,想要使用这个位置的配置文件需要去IDEA中配置
maven安装目录可以通过
mvn -v
命令查看
2.2.2、配置镜像加速
有些仓库在国内访问速度较慢,因此会出现一些镜像仓库,如阿里云等
-
配置当前项目镜像加速
只需要在当前项目的pom.xml里配置即可
<repositories> <repository> <id>ali-maven</id> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </repository> </repositories>
复制 -
配置全局生效
修改maven的配置文件setting.xml
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
复制
2.2.3、排除依赖
当我们引入第三方jar包的时候,难免会引入传递性依赖,有些时候这是好事,然而有些时候我们不需要其中的一些传递性依赖
比如,我们不需要spring-core中的commons-logging
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5.6</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
复制
2.2.4、依赖版本全局管理
在使用maven构建项目时,相同系列依赖往往需要使用相同的版本号。我们把版本号全局管理,更容易管理
<?xml version="1.0" encoding="UTF-8"?>
<project .....>
<!-- 全局管理版本号 -->
<properties>
<okhttp.version>4.9.0</okhttp.version>
</properties>
<dependencies>
<!-- 通过${}引用版本号变量 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp.version}</version>
</dependency>
</dependencies>
</project>
复制
2.2.5、私有仓库配置
-
Nexus搭建配置
过程略,参考Maven私有仓库搭建以及使用
-
Maven配置
在maven的settings.xml文件中配置
<profiles> <profile> <id>MyProfile</id> <repositories> <repository> <id>maven-releases</id> <url>http://192.168.2.132:8081/repository/maven-releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>maven-snapshots</id> <url>http://192.168.2.132:8081/repository/maven-snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles>
复制 -
项目配置
在maven项目的pom.xml中配置
<!--构件部署至私有仓库--> <distributionManagement> <repository> <id>maven-releases</id><!--此处的id要和settings.xml中repository的id保持一致--> <name>Nexus Release Repository</name> <url>http://192.168.2.132:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <id>maven-snapshots</id><!--此处的id要和settings.xml中repository的id保持一致--> <name>Nexus Snapshot Repository</name> <url>http://192.168.2.132:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
复制 -
发布到私有库
若项目版本号末尾带有 -SNAPSHOT,则会发布到snapshots快照版本仓库
若项目版本号末尾带有 -RELEASES 或什么都不带,则会发布到releases正式版本仓库
mvn clean deploy
复制