目录
Maven是什么
- Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM);
- POM(Peoject Object Model):项目对象模型;
Maven的作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式;
- 依赖管理:方便快捷的管理项目依赖的资源,避免资源间的版本冲突问题;
- 统一开发结构:提供标准的、统一的项目结构;
Maven的安装与配置
下载
下载地址:
官网下载地址最新版
下载慢也可以使用网盘,永久有效:
百度网盘链接,包括多版本
下载二进制文件 windows版本bin.zip或者Linux版本tar.gz
安装
解压到自己的文件夹内
E:\apache-maven-3.6.3
内容:
- bin目录:所有maven可运行的指令
- boot目录:maven的类加载器
- conf:maven的相关配置
- lib:maven运行所依赖的jar包
配置JAVA_HOME
我的电脑-》右键-》属性-》高级系统设置-》环境变量-》系统变量:新建-》变量名:JAVA_HOME;变量值:C:\Program Files\Java\jdk1.8.0_311 安装java的绝对路径-》确定
配置MAVEN_HOME
设置maven自身的运行环境:
我的电脑-》右键-》属性-》高级系统设置-》环境变量-》系统变量:新建-》变量名:MAVEN_HOME;变量值:E:\apache-maven-3.6.3 解压maven绝对路径
配置path环境变量
maven的path环境变量:
我的电脑-》右键-》属性-》高级系统设置-》环境变量-》系统变量-》找到path-》新建-》%MAVEN_HOME%\bin
java的path环境变量:
我的电脑-》右键-》属性-》高级系统设置-》环境变量-》系统变量-》找到path-》新建-》%JAVA_HOME%\bin
验证
cmd输入mvn -v 能看到版本说明安装成功
C:\Users\Valen>mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: E:\apache-maven-3.6.3\bin\..
Java version: 1.8.0_311, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_311\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
本地仓库配置
默认在用户下的.m2文件内
修改本地仓库位置:
在指定位置新建一个repo文件夹:
- 打开conf文件夹内的settings.xml文件
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
将/path/to/local/repo复制卸载注释块外,将路径修改为自己指定的本地仓库文件夹:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>E:\apache-maven-3.6.3\repo</localRepository>
远程仓库配置
因为中央仓库是外网,下载资源的时候网速慢,所以可以改成国内的镜像中央仓库,比如阿里的,网易的等等
在settings.xml文件的mirrors标签内,设置仓库位置;
<mirrors>
<!-- 配置具体仓库的下载镜像 -->
<mirror>
<!-- 此镜像的唯一标识符,用来区分不同的mirror元素 -->
<id>alimaven</id>
<!-- 井巷名称 -->
<name>aliyun maven</name>
<!-- 镜像URL -->
<url>https://maven.aliyun.com/repository/public/</url>
<!-- 对哪种仓库进行镜像,简单说就是替代哪个仓库 -->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
Maven基本概念
仓库
用于存储资源,包含各种jar包
- 本地仓库
自己电脑上存储资源的仓库,链接远程仓库获取资源 - 远程仓库
非本机电脑上的仓库,为本地仓库提供资源- 中央仓库
Maven团队维护,存储所有资源的仓库 - 私服
部门/公司范围内存储资源的仓库,从中央仓库获取资源
- 中央仓库
私服作用
- 保存具有版权的资源,包含购买或自主研发的资源;
- 中央仓库中的jar都是开源的,不能存储具有版权的资源;
- 一定范围内共享资源,仅对内部开放不对外共享;
官方中央仓库地址
https://mvnrepository.com/
坐标
Maven中的坐标用于描述仓库中资源的位置,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成;
坐标的组成
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如org.mybatis)
- artifactId:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
- version:定义当前项目版本号
- …
Maven项目构建命令
Maven构建命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔;
在pom文件同级目录下执行mvn命令
mvn compile # 编译
mvn clean # 清理
mvn test # 测试
mvn package # 打包
mvn install # 安装到本地仓库
插件创建Maven工程
mvn archetype:generate
-DgroupId=per.xgt #新建项目的工程名
-DartifactId=mavendemo #要创建的项目名称
-Dversion=1.0.0-SNAPSHOT #要创建的项目的版本号
-Dpackage=per.xgt #要创建的项目的基础包名
IDEA 使用Maven
配置Maven
File-》Settings-》Build,Execution,Deployment或者直接搜索Maven-》Maven home path,选择maven安装路径-》User setting file选择使用的maven配置文件Sessings.xml具体位置-》Local repository 选择本地仓库位置
创建Maven工程
- New 一个新的Project或者创建一个新的Module,左侧选择Maven选择或不选择模板,Next
- Name项目/模块名,Artifact Coordinates可以阐述项目的隶属团队,模块名,版本
- Finish
写依赖
在POM文件中添加需要的资源/jar/依赖
<dependencies>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
右侧边栏点击Maven或者POM文件右键 选择Reload Project,将依赖jar包添加下载进项目就可以使用了
Tomcat插件启动web工程
在pom文件中添加Tomcat插件
<build>
<!-- 设置插件 -->
<plugins>
<!--具体插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
右侧刷新项目,找到Maven-》plugins-》Tomcat-》tomact.run 双击,就可以启动服务器;
依赖管理
依赖配置
- 依赖:当前项目运行所需的jar,一个项目可以设置多个依赖
<!-- 设置当前项目所依赖的所有jar -->
<dependencies>
<!-- 具体的依赖 -->
<dependency>
<!-- 依赖所属群id -->
<groupId>junit</groupId>
<!-- 依赖所属项目id -->
<artifactId>junit</artifactId>
<!-- 依赖版本号 -->
<version>4.13.2</version>
</dependency>
</dependencies>
依赖传递
依赖具有传递性:
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源中有依赖其他资源,当前项目间接依赖其他资源
依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当前资源在相同层级被依赖时,配置顺序靠前覆盖配置顺序靠后的
- 特殊有限:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
可选依赖
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
<optional>true</optional>
</dependency>
对外隐藏当前所依赖的资源----不透明
排除依赖
主动断开依赖的资源,被排除的资源无需指定版本----不需要
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<exclusions>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖范围
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
标签指定依赖的作用范围;
- 主程序范围有效(man文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
参数:
- compile:不声明scope元素的情况下的默认值;compile表示被依赖包需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,是一个比较强的依赖;打包的时候通常需要包含进去。
- provided:provided 类型的scope只会在项目的编译、测试阶段起作用;可以认为在目标容器中已经提供了这个依赖,无需在提供,但是在编写代码或者编译时可能会用到这个依赖;依赖不会被打入到项目jar包中。
<dependency>下的子标签<optional> ,如果一个依赖的<optional> 设置为true,则该依赖在打包的时候不会被打进jar包,同时不会通过依赖传递传递到依赖该项目的工程;
这两者的区别在于:
1、<optional>为true 表示某个依赖可选,该依赖是否使用都不会影响服务运行;
2、<scope>的provided在目标容器中已经提供了这个依赖,无需在提供
- runtime:runtime与compile比较相似,区别在于runtime 跳过了编译阶段,打包的时候通常需要包含进去。
- test:在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,不会被打包到项目jar包中,同时如果项目A依赖于项目B,项目B中的test作用域下的依赖不会被继承。
- system:表示使用本地系统路径下的jar包,需要和一个systemPath一起使用
<dependency>
<groupId>XX</groupId>
<artifactId>XX</artifactId>
<systemPath>${basedir}/lib/XX.jar</systemPath>
<scope>system</scope>
<version>XX</version>
</dependency>
- import:import 只能在pom文件的中使用,从而引入其他的pom文件中引入依赖,如:在Spring boot 项目的POM文件中,我们可以通过在POM文件中继承 Spring-boot-starter-parent来引用Srping boot默认依赖的jar包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.BUILD-SNAPSHOT</version>
</parent>
但是,通过上面的parent继承的方法,只能继承一个 spring-boot-start-parent。实际开发中,用户很可能需要继承自己公司的标准parent配置,这个时候可以使用 scope=import 来实现多继承
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.1.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
通过上面方式,就可以获取spring-boot-dependencies.2.0.1.BUILD-SNAPSHOT.pom文件中dependencyManagement配置的jar包依赖。如果要继承多个,可以在dependencyManagement中添加
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.1.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
生命周期
项目构建周期:一次构建过程经过了多少个事件;
Maven对项目构建的生命周期划分为三套:
- 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:将生成的站点文档部署在特定的服务器上
插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认Maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
generate-test-resources:代表就是在生成测试资源文件阶段对Test源码进行打包
分模块
- 模块中仅包含当前模块对应的功能类与配置文件
- Spring核心配置根据模块功能不同进行独立制作
- 当前模块所依赖的模块通过导入坐标的形式加入当前模块后才可以使用
在编译当前模块时,需要先将依赖的模块进行打包install(打成jar包放入本地仓库)<dependency> <groupId>per.xgt</groupId> <artifactId>Mybattis-01-HelloWorld</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
- web.xml需要加载所有的Spring核心配置文件,不同模块的Spring配置文件用不同的名字
分模块聚合
新建一个管理构建模块只需要一个pom文件
<!--定义该工程用于进行构建管理-->
<packaging>pom</packaging>
添加需要管理的工程
<!--管理的工程列表-->
<modules>
<!--具体的工程名-->
<module>../Mybatis-01-HelloWorld</module>
<module>../Mybatis-02-Config</module>
</modules>
注意: 参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关;
模块依赖继承
在聚合父工程的POM文件中进行需要的所有的依赖管理
<!--声明此处进行依赖管理-->
<dependencyManagement>
<dependencies>
<!--具体的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
在聚合父工程的POM文件中进行需要的所有插件管理
<build>
<pluginManagement>
<plugins>
<plugin>
</plugin>
</plugins>
</pluginManagement>
</build>
在具体实现的子模块中声明继承哪个父工程
<parent>
<groupId>per.xgt</groupId>
<artifactId>Mybatis-02-Config</artifactId>
<version>1.0-SNAPSHOT</version>
<!--父工程POM文件的相对路径-->
<relativePath>../Mybatis-02-Config/pom.xml</relativePath>
</parent>
依赖的版本不需要配置,会使用父工程所声明的依赖版本;
继承与集合:
- 作用:集合用于快速构建项目;继承用于快速配置;
- 相同点:集合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个POM文件中;聚合与继承均属于涉及型模块,并无实际的模块内容;
- 不同点:聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些;继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己;
属性定义与使用
属性类别
- 自定义属性
版本统一可以通过变量引用的形式,一改全改;
使用属性值<!--定义自定义属性--> <properties> <spring.version>5.1.9.RELEASE</spring.version> </properties>
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <!--使用属性值--> <version>${spring.version}</version> </dependency> </dependencies>
- 内置属性
Maven内置属性
调用格式:${basedir} ${project.version}:project. 可以省略
- Setting属性
配置文件settings.xml中标签属性,用于动态配置
调用格式:${settings.localRepository}
- Java系统属性
读取java系统属性
调用格式:
系统属性查询方式${user.home}
mvn help:system
- 环境变量属性
读取系统环境变量属性
调用格式:
环境变量属性查询方式${env.JAVA_HOME}
mvn help:system
版本管理
工程版本:
- SNAPSHOT:快照版本,临时性版本(测试阶段版本),会随着开发的进度不断更新
- RELEASE:发布版本,香团队外部发布较为稳定的版本,几遍进行功能后续的开发,也不会改变当前发布版本内容
配置文件读取pom 属性
peoperties配置文件:
jdbc.username=${jdbc.username}
pom文件内定义这个变量:
<properties>
<jdbc.username>root</jdbc.username>
</properties>
<build>
<!--配置资源文件对应的信息-->
<resources>
<resource>
<!--这顶配置文件对应的位置目录,支持使用属性动态设定路径-->
<directory>${project.basedir}src/main/resource</directory>
<!--开启堆配置文件的资源加载过滤-->
<filtering>true</filtering>
</resource>
</resources>
</build>
多环境配置
创建多环境配置
<!--创建多环境-->
<profiles>
<!--定义具体的环境-->
<profile>
<!--定义环境定义的唯一名称-->
<id>produce_env</id>
<properties>
</properties>
<!--设置默认启动-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--定义具体的环境-->
<profile>
<id>dep_env</id>
</profile>
</profiles>
使用
mvn 指令 -P 环境定义id
mvn install -P dep_env
跳过测试
- 命令跳过
mvn 指令 -D skipTests
不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下
-D maven.test.skip=true
不执行测试用例,也不编译测试用例类
- 配置跳过
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<!--设置包含的-->
<includes>
<include>**/UserServiceTest.java</include>
</includes>
<!--设置排除的-->
<excludes>
<exclude></exclude>
</excludes>
<!--一般不这么做:跳过所有测试-->
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>