maven简介
maven是什么
maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
POM(project object model):项目对象模型
maven的作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
maven基础概念
仓库
仓库:用于存储资源,包含各种jar包
仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
- 中央仓库:maven团队维护,存储所有资源的仓库
- 私服:部门\公司范围内存储资源的仓库,从中央仓库获取资源
- 私服的作用:
- 保存具有版权的资源,包含购买或自主研发的jar
- 中央仓库中的jar都是开源的,不能存储具有版权的资源
- 一定范围内共享资源,仅对内部开放,不对外共享,访问速度快
- 保存具有版权的资源,包含购买或自主研发的jar
坐标
1、什么是坐标?
- maven中的坐标用于描述仓库中资源的位置
2、maven坐标的主要组成
- groupId:定义当前maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
- artifactId:定义当前maven项目名称(通常是模块名称,例如CRM、SMS)
- version:定义当前项目版本号
- packaging:定义该项目的打包方式
3、maven坐标的作用
- 使用唯一标识,唯一性定位资源位置,通过该表示可以将资源的识别与下载工作交由机器完成
本地仓库配置
- maven启动后,会自动保存下载的资源到本地仓库
- 默认位置
- <localRepository>/path/to/local/repo</localRepository>
- 当前目录位置为登录用户名所在目录下的.m2文件夹中
- 自定义位置
- <localRepository>D:\maven\repository</localRepository>
- 当前目录位置为D:\maven\repository文件夹中
- 默认位置
镜像仓库配置
在setting文件中配置阿里云镜像仓库
<mirrors>
<mirror>
<!--此镜像的唯一标识符,用来区分不同的mirror元素-->
<id>nexus-aliyun</id>
<!--对哪种仓库进行镜像,简单说就是替代那个仓库-->
<mirrorOf>central</mirrorOf>
<!--镜像名称-->
<name>Nexus aliyun</name>
<!--镜像URL-->
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
</mirrors>
全局setting与用户setting区别
- 全局setting定义了当前计算机中maven的公共配置
- 用户setting定义了当前用户的配置
依赖管理
依赖配置
- 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
- 格式:
<dependencies>
<!-- 具体的依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
依赖传递
- 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被资源的资源如果依赖其他依赖,当前项目间接依赖其他资源
依赖传递冲突问题
- 路径优先:当前依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
可选依赖
可选依赖指对外隐藏当前所依赖的资源--不透明
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
<optional>True</optional>
</dependency>
排除依赖
排除依赖指主动断开依赖的资源,被排挤的资源无需指定版本--不需要
<dependency>
<!-- 组织id-->
<groupId>com.itheima</groupId>
<!-- 项目id-->
<artifactId>web01</artifactId>
<!-- 版本号:release完成版,snapshot开发版-->
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖范围
- 依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
- 作用范围
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
依赖范围传递性
- 带有依赖范围的资源在进行传递时,其作用范围将受到影响
生命周期与插件
项目构建生命周期
maven构建生命周期描述的是一次构建过程经历了多少个时间
maven对项目构建的生命周期划分为套:
- clean:清理共作
- default:核心工作,例如编译,测试,打包,部署等
- site:产生报告,发布站点等
1、clean生命周期
2、default构建生命周期
3、site构建生命周期
分模块开发与设计
分模块开发意义
将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享
分模块开发
- 创建Maven模块
- 书写模块代码(分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分)
- 通过maven指令安装模块到本地仓库(install指令),团队内部开发需要发布模块功能到团队内部可共享的仓库中(私服)
继承与聚合
聚合
- 聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合
- 聚合工程:通常是一个不具有业务功能的“空”工程(有且仅有一个pom文件)
- 作用:使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建
- 当工程中某个模块发生更新(变更)时,必须保障工程中与已更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题
1.创建Maven模块,设置打包类型为pom(每个maven工程都有对应的打包方式,默认为jar,web工程打包方式为war)
<packaging>pom</packaging>
2.设置当前聚合工程所包含的子模块名称(聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关;参与聚合的工程无法向上感知是否参与聚合,只能向下配置哪些模块参与本工程的聚合)
<modules>
<module>../springmvc_11_page</module>
<module>../maven_03_pojo</module>
<module>../maven_04_dao</module>
</modules>
继承
- 概念:
- 继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承
- 作用:
- 简化配置
- 减少版本冲突
1.创建Maven模块,设置打包类型为pom
<packaging>pom</packaging>
2.在父工程的pom文件中配置依赖关系(子工程将沿用父工程中的依赖关系)
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
......
</dependencies>
3.在父工程中配置子工程中可以选择的依赖关系
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
......
</dependencyManagement>
4.在子工程中配置当前工程所继承的父工程
<parent>
<groupId>com.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../maven_01_parent/pom.xml</relativePath>
</parent>
5. 在子工程中配置使用父工程中可选依赖的坐标
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
子工程中使用父工程中的可选依赖时,仅需要提供群组id和项目id,无需提供版本,版本由父工程统一提供,避免版本冲突子工程中还可以定义父工程中没有定义的依赖关系
聚合-与继承的区别
- 作用
- 聚合用于快速构建项目
- 继承用于快速配置
- 相同点:
- 聚合与继承的pom.xm1文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
- 聚合与继承均属于设计型模块,并无实际的模块内容
- 不同点:
- 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
- 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
属性
1.定义属性
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
2.引用属性
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
资源文件引用属性
1.定义属性
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<jdbc.url>jdbc:mysql://localhost:3306/ssm_db</jdbc.url>
</properties>
2.配置文件中引用属性
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=root
3.开启资源文件目录加载属性的过滤器
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
4.配置maven打war包时,忽略web.xml检查(了解)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
其他属性(了解)
版本控制
- 工程版本:
- SNAPSHOT(快照版本)
- 项目开发过程中临时输出的版本,称为快照版本
- 快照版本会随着开发的进展不断更新
- RELEASE(发布版本)
- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本
- SNAPSHOT(快照版本)
- 发布版本
- alpha版
- beta版
- 纯数字版
多环境开发
maven提供配置多种环境的设定,帮助开发者使用过程中快速切换环境
1.定义多环境
<!--定义多环境-->
<profiles>
<!--定义具体的环境:开发环境-->
<profile>
<!--定义环境对应的唯一名称-->
<id>env_dep</id>
<!--定义环境中专用的属性值-->
<properties>
<jdbc.url>jdbc:mysql://localhost:3306/ssm_db</jdbc.url>
</properties>
<!--设置是否为默认启动环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>env_pro</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
</profile>
<profile>
<id>env_test</id>
<properties>
<jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
2.使用多环境(构建过程)
#mvn 指令 -P 环境定义id
mvn install -P env_dep
跳过测试
#mvn 指令 -D skipTests
mvn install -D skipTests
执行的项目构建指令必须包含测试生命周期,否则无效果。例如执行compile生命周期,不经过test生命周期
细粒度控制跳过测试
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
<configuration>
<skip>false</skip>
<!--排除不参与测试的内容-->
<excludes>
<exclude>**/BookServiceTest.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
私服
私服简介
- 私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题
- Nexus
- Sonatype公司的一款maven私服产品
Nexus启动
- 启动服务器(命令行启动)
nexus.exe /run nexus
- 访问服务器(默认端口:8081)
http://localhost:8081
- 修改基础配置信息
- 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口
- 修改服务器运行配置信息
- 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间
私服仓库分类
资源上传与下载
本地仓库访问私服权限设置
配置位置(setting.xml)
<!--配置访问私服的权限-->
<servers>
<server>
<id>itheima-release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>itheima-snapshot</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
本地仓库访问私服地址设置
配置位置(setting.xml)
<!--私服的访问路径-->
<mirrors>
<mirror>
<id>maven-public</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
工程上传到私服服务器设置
配置位置(工程pom文件中)
<distributionManagement>
<repository>
<id>itheima-release</id>
<url>http://localhost:8081/repository/itheima-release/</url>
</repository>
<snapshotRepository>
<id>itheima-snapshot</id>
<url>http://localhost:8081/repository/itheima-snapshot/</url>
</snapshotRepository>
</distributionManagement>
发布命令
mvn deploy