一、安装maven
-
安装maven之前,需要先安装java环境
-
下载maven安装包
- 下载路径 https://maven.apache.org/download.cgi
- 目前安装的是 3.5.4 版本
-
解压压缩包到一个不包含中文的路径下
-
安装路径
D:\Program Files
-
-
配置环境变量
#添加MAVEN_HONE MAVEN_HOME=D:\Program Files\apache-maven-3.5.4 #追加Path路径 %MAVEN_HOME%\bin
-
测试
运行 mvn -v 命令,正常输出则表示安装完成
二、Maven工程说明
- maven工程约定的目录结构
-
maven工具实现自动编译的原理就是按照上面的约定目录来查找的。
约定>配置>编码
-
常用Maven命令
-
执行与构建过程相关的Maven命令时,必须进入到pml.xml所在的目录下。
-
与构建相关的命令包括:编译、测试、打包…
-
常用命令
- mvn clean: 清理
- mvn compile: 编译主程序
- mvn test-compile: 编译测试程序
- mvn test: 执行测试程序
- mvn package: 打包
- mvn install: 安装
- mvn site:生成站点
-
测试mvn compile命令
maven的核心程序中仅仅定义了抽象的生命周期,具体的工作需要由对应的插件完成。而插件不包含在核心程序中。
当每次执行maven命令时,maven核心程序会去本地仓库中查找,如果没有就会去中心仓库下载。
maven的默认仓库地址在 “%USERPROFILE%.m2\repository” 下面。
-
-
修改本地仓库地址
找到解压目录下的配置文件 根据安装目录查找 我的安装目录是 D:\Program Files\apache-maven-3.5.4\conf\settings.xml
修改配置内容
<localRepository>E:\maven-repository</localRepository>
-
执行构建命令会在项目根目录下创建一个target目录
-
构建过程的各个环节
- 清理:将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
- 编译:将java源程序编译成class字节码文件
- 测试:自动测试,自动调用junit程序。该步骤可以跳过 -Dmaven.test.skip=true
- 报告:测试程序执行的结果
- 打包:动态Web工程打war包,Java工程打jar包
- 安装:Maven特定的概念—将打包得到的文件复制到“仓库”中的指定位置。
- 部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可运行
pom.xml文件
-
含义
POM:Project Object Model 项目对象模型
类似于 DOM:Document Object Model 文档对象模型
-
pom.xml
pom.xml文件就是Maven工程的核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。
-
pom坐标
数学中的坐标:
- 在二维平面中,使用x、Y两个向量可以定位二维平面中任意一个点。
- 在三维平面中,使用X、Y、Z三个向量可以定位三维空间中任意一个点。
maven中的坐标
使用下面三个向量在仓库中唯一定位一个Maven工程
-
groupId
#一般使用公司或组织域名倒序+项目名 <groupId>junit</groupId> <groupId>org.springframework.boot</groupId>
-
artifactId
#使用模块名称 <artifactId>junit</artifactId> <artifactId>spring-boot-starter-web</artifactId>
-
version
#版本号 <version>4.12</version> <version>2.1.6.RELEASE</version>
-
依赖定位和仓库的关系
如下列依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.6.RELEASE</version> </dependency>
它的仓库路径为
org/springframework/boot/spring-boot-starter-web/2.1.6.RELEASE/spring-boot-starter-web-2.1.6.RELEASE.jar
-
仓库分类
本地仓库
当前电脑上的仓库,为当前电脑上所有Maven工程服务。
远程仓库
-
私服:搭建在局域网,为局域网内的所有Maven工程服务。
-
中央仓库:架设在公网上,为全世界所有maven工程服务。
-
中央仓库镜像:为了分担中央仓库的压力,在不同地址搭建中央仓库的镜像,提升用户访问速度。
-
-
仓库中保存的内容
- Maven自身所需要的插件
- 第三方jar包
- 自己开发的Maven工程
-
依赖
依赖范围 默认compile
-
test范围
#test范围 #在main目录下的包中不能引用 #不参与打包 <scope>test</scope>
-
compile范围
#compile范围 #在main和test目录下的包都能引用 #参与打包 <scope>compile</scope>
-
provided范围
#provided范围 主要对应web应用来说的 如依赖servler-api.jar #在开发时需要 #运行时由容器提供 如tomcat #不参与打包 <scope>provided</scope>
-
runtime
`runtime依赖在运行和测试的时候需要,但在编译的时候不需要。与compile相比,被依赖项目无需参与项目的编译。
比如:jdbc的驱动包,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
由于运行时需要所以runtime范围的依赖会被打包。`
-
system
- system范围依赖与provided类似,但是你必须显式的提供一个位于本地系统中JAR文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。
-
import
import
只能在pom文件的<dependencyManagement>中使用,从而引入其他的pom文件中的依赖。如继承自己公司内部的标准parent配置。<dependencyManagement> <dependencies> <!-- Override Spring Data release train provided by Spring Boot --> <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>
-
-
生命周期
- 各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行
- Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。
- Maven核心程序为了更好的实现自动化构建,按照这样的特点执行生命周期中的各个阶段。不论现在要执行生命周期中的那个阶段,都是从这个生命周期最初的位置开始执行。
-
测试maven命令,查看执行过程
-
mvn compile
-
mvn test
- mvn package
以上可以看出,不管执行什么命令,都是以第一个命令开始执行,到目标命令处结束。
-
-
每个阶段都由不同的插件完成,相似的目标由相同的插件完成
-
依赖具有传递性
如A依赖B,B依赖C,则A同时会依赖于B和C。
只有compile范围的依赖可以传递,test和provided范围不能传递。
-
依赖排除
当不需要某一个传递过来的依赖时,可以排除该依赖
<exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-jcl</artifactId> </exclusion> </exclusions>
-
依赖原则
路径最短者优先原则
列如A项目依赖于B,B项目依赖于C项目,同时B依赖于D的1.0.1版本,C依赖于D的1.0.2版本,按照最短路径优先原则,A将依赖于D的1.0.1版本。A->B->D(1.0.1)的路径为2,A->B->C->D(1.0.2)的路径为3。
如果路径相同,则先声明者优先。
列如A项目依赖于B和C,B依赖于D的1.0.1版本,C依赖于D的1.0.2版本,A->B->D(1.0.1)路径为2,A->C->D(1.0.2)的路径也为2,因为依赖B的声明写在前面,所以A传递依赖于D的1.0.1版本。
-
统一管理依赖
#使用properties标签自定义一个标签 <properties> <junit.version>4.12</junit.version> </properties> #在引用依赖的地方使用自定义标签 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> #以后需要更换依赖的版本时,直接改自定义标签的值就可以了
-
继承关系
使用父工程统一管理依赖版本号,在子工程中不指定版本号。
父工程的打包方式是pom。
<modelVersion>4.0.0</modelVersion> <groupId>SpringCloud-Study</groupId> <artifactId>SpringCloud-Study</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging>
子工程中只需要指定artifactId,不需要指定groupId,version
<parent> <artifactId>SpringCloud-Study</artifactId> <groupId>SpringCloud-Study</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>SpringCloud-API</artifactId>
-
聚合关系
在父工程中配置子工程的聚合关系
<modules> <module>SpringCloud-API</module> <module>SpringCloud-Provider-Dept-8001</module> <module>SpringCloud-Consumer-dept-80</module> <module>SpringCloudEureka-7001</module> <module>SpringCloudEureka-7002</module> <module>SpringCloudEureka-7003</module> <module>SpringCloud-Provider-Dept-8002</module> <module>SpringCloud-Provider-Dept-8003</module> <module>SpringCloud-Consumer-dept-feign</module> <module>SpringCloud-Provider-Dept-Hystrix-8001</module> <module>SpringCloud-Provider-Dept-Hystrix-DashBoard</module> <module>SpringCloud-Zuul-9527</module> <module>SpringCloud-Config-Server-3344</module> <module>SpringCloud-Config-Client-3355</module> <module>SpringCloud-Eureka-Config-7001</module> <module>SpringCloud-Config-Provider-Dept-8001</module> </modules>
在父工程中执行打包命令 mvn package,会把所有子工程也打包。