1. 下载安装
maven官网:http://maven.apache.org/download.cgi
建议Windows平台下载*.zip压缩包,而Linux平台下载.gz压缩包
- 下载完放到指定目录下解压即可,然后配置一下环境变量,在cmd里面使用mvn -v 命令查看是否安装成功即可
- 配置远程仓库镜像地址,下面推荐使用阿里的镜像仓库,在公司需要配置公司的私有仓库
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2. Maven的约定
Maven采用了”约定优于配置(Convention over Configuration,CoC)”的原则,根据此原则,Maven的主要约定有如下几条:
- 源代码应该位于
${basedir}/src/main/java
路径下 - 资源文件应该位于
${basedir}/src/main/resourse
路径下 - 测试代码应该位于
${basedir}/src/test
路径下 - 编译生成的class文件应该位于
${basedir/target/classes}
路径下 - 项目应该会产生一个JAR文件,并将生成的JAR包放在
${basedir}/target
路径下
3. Maven的简化版生命周期
上图就是maven的简化版生命周期,分别介绍一下:
- clean:执行清理, 就是删除 target 文件夹
- validate: 验证项目是否正确,所有必要的信息可用
- compile: 编译项目的源代码
- test : 使用合适的单元测试框架测试编译的源代码。
- package : 项目打包
- verify: 对集成测试的结果执行任何检查,以确保满足质量标准
- install : 安装到本地仓库
- deploy: 部署到远程仓库
下图显示了默认的生命周期所包含的核心阶段的执行过程:
4. Maven的坐标(coordinate)
POM需要为项目提供一个唯一标识符,
这个标识符就被称为Maven坐标,Maven坐标由4个元素组成
- groupId: 该项目的开发者的域名
- artifactId:指定项目名
- package: 指定项目打包的类型
- version: 指定项目的版本
5. Pom文件玩法
下面我就从0新搭建一个maven父子工程来讲一些基础玩法哈
- 创建父工程
- 因为这是父工程,我就把src删掉了,没啥用,看到的就是下面这个
- modelVersion : 这个创建maven就会自动生成,指定了当前POM模型的版本,对于Maven2及Maven 3来说,它只能是4.0.0
- 其他三个是你自己创建时定义的,具体看图中注释哈
5.1 父工程里面
几个常用的配置:
5.1.1 配置 <packaging>pom</packaging>
- 定义packaging为
pom
,表示他是爸爸,如果存在子工程,这里必须时pom。表示子工程需要继承父工程
<packaging>pom</packaging>
- name 标签:开发常用的简称,推荐中文结合
<name>${project.artifactId} | 测试父工程</name>
- description 标签:核心功能和在整个架构中的作用,就是一些描述信息
- inceptionYear 标签: 开发年份
- url 标签: url链接
5.1.2 配置 parent
- 指定父工程:
接下来是指定父工程,比如我指定boot的版本是2.1.5
如果这段配置放在父工程里面,接下来所有的子工程都不需要配置,直接继承使用即可
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
5.1.3 配置 properties
- 配置
properties
:
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.version>0.9.0.RELEASE</spring-cloud-alibaba.version>
<lombok.version>1.16.20</lombok.version>
</properties>
定义jar包的版本库,用来统一版本号,避免冲突
注意: boot和Cloud版本是有对应关系的,搞不清访问下面这个链接,是官方提供的:
https://start.spring.io/actuator/info
5.1.4 配置 dependencyManagement
- 配置
dependencyManagement
声明依赖:
<dependencyManagement>
<dependencies>
<!-- spring-cloud主版本管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba主版本管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- lombok主版本管理 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
dependencyManagement只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。
如果不在子项目中声明依赖,是不会从父项目中继承下来的;
只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;
另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本;
通俗点说就是,dependencyManagement只是一个声明定义,子工程要用,就在子工程里面直接用,不需要指定版本号,会引用父工程的版本号,如果子工程不想用父工程里面声明的版本号,就自己指定,完事;
注意:<type>pom</type>
和 <scope>import</scope>
的玩法:
pom和import的作用在于解决maven的单继承问题
通俗一点的理解就是,你可以理解为把外面的parent扔到了dependencyManagement里面,比如上面的 spring-boot-starter-parent 是通过parent标签放在外面的,现在我把它丢到dependencyManagement里面,如果想达到相同的效果,就必须使用pom和import标签;位置不同,使用的标签不同而已
5.1.5 配置 dependencies
注意: 在父工程里面配置dependencies,会强制性的会添加到子模块当中,子模块一定会加载,所以这里我们一般不配置
5.16 relativePath
玩法
如上图所示:加在那的作用就是表示一直从远程仓库获取,不走本地仓库
默认是…/pom.xml 但是如果设定为空值,不就是避开本地仓库嘛哈哈
MAVEN构建jar包时候查找顺序:
relativePath元素中的地址–本地仓库–远程仓库
5.2 子工程
基于父工程创建子工程,以上面的为案列:
<?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">
<parent>
<artifactId>wql-maven</artifactId>
<groupId>com.ooo</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>wql-maven-user</artifactId>
</project>
默认会关联父工程,因为版本已经在父工程定好了,我们只需要引入需要的依赖即可,不需要指定版本,避免了版本冲突问题
<packaging>jar</packaging>
<name>${project.artifactId} | 测试user子工程</name>
<!-- 从父类当中选择要添加的jar,不需要定义版本号-->
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--提供监控系统健康情况的工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--seata 根据下载的版本来-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
</dependencies>
6. scope
标签玩法
指定依赖库起作用的范围。
该子元素可接受compile、provided、test、system、runtime、import等值;
-
compile:默认的范围,编译、测试、打包时需要
-
provided:表示容器会在runtime时提供
-
runtime:表示编译时不需要,但测试和运行时需要,最终打包会包含进去
-
test:只用于测试阶段
-
system:与provided类似,但要求该JAR是系统中自带的
当maven依赖本地而非repository中的jar包,sytemPath指明本地jar包路径
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/ojdbc7.jar</systemPath>
</dependency>
- import:继承父POM文件中用dependencyManagement配置的依赖,import范围只能在dependencyManagement元素中使用(为了解决多继承)
7. 打包
直接在父工程里面配置mave打包插件即可,子工程不需要配置,但是子工程需要指定生成jar包的名字
- 父工程里面
<build>
<finalName>wql-maven</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 子工程里面
<build>
<finalName>wql-maven-admin</finalName>
</build>
看自己搭配哈,用法很多种,打包的时候,可以通过父工程一键打包即可;