Maven(mvn)基础
文章目录
- Maven(mvn)基础
- 传统项目管理状态分析
- Maven是什么
- Maven的作用
- 下载与安装
- 1.下载安装
- 2.环境变量配置
- Maven基础概念
- 仓库
- 坐标
- 本地仓库配置
- 全局setting与用户setting
- 第一个Maven项目(手动)
- Maven工程目录结构
- Maven项目构建命令(基础)
- 第一个Maven项目(IDEA自动版)
- 配置Maven
- 创建Maven项目
- 用Maven创建Java
- 用Maven创建web应用
- pom中添加tomcat插件
- pom默认配置项说明
- 依赖管理
- 依赖配置
- 依赖传递
- 可选依赖
- 排除依赖
- 依赖范围
- 依赖范围传递性(了解)
- 生命周期与插件
- 构建项目生命周期
- 插件
官网:Maven – Welcome to Apache Maven
传统项目管理状态分析
- jar包不统一,jar包不兼容
- 工程升级维护过程操作繁琐
Maven是什么
Maven本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
POM(Project Object Model):项目对象模型
Maven的作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
下载与安装
1.下载安装
结构:
- bin:运行项
- boot:类加载框架
- conf:配置内容
- lib:Maven运行时所需要的所有Java类库
2.环境变量配置
- 依赖Java,需要配置JAVA_HOME
- 设置maven自身的运行环境,需要配置MAVEN_HOME
a.环境变量:
- 新建系统变量,变量名:MAVEN_HOME,变量值:maven的路径
- 编辑path,新建项:%MAVEN_HOME%\bin
b.测试:
cmd下运行mvn,显示[INFO]项即可
Maven基础概念
仓库
仓库:用于存储资源,包含各种jar包
分类:
-
本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
-
远程仓库:非本机电脑上的仓库,为本地仓库提供资源
- 中央仓库:Maven团队维护,存储所有资源的仓库
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
私服的作用:
- 保存具有版权的资源,包含购买或自主研发的jar
- 中央仓库中的jar都是开源的,不能存储具有版权的资源
- 一定范围内共享资源,仅对内开放,不对外共享
坐标
坐标:Maven中的坐标用于描述仓库中资源的位置
maven仓库官网:Maven Repository: Search/Browse/Explore (mvnrepository.com)
maven坐标主要组成:
- groupId:定义maven项目隶属的组织
- artifactId:定义maven项目名(通常是模块名称,eg:SMS)
- version:定义当前项目版本号
- packaging:项目的打包方式
maven坐标的作用:
使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。
本地仓库配置
-
maven启动后,会自动保存下载的资源到本地仓库
-
默认位置(在xml文件中被注释部分)
<localRepository>${user.home}/.m2/repository</localRepository>
当前目录位置为登录用户所在目录的.m2文件夹中
-
自定义位置
<localRepository>F:\maven\repository</localRepository>
当前目录为F:\maven\repository文件夹中
-
-
镜像仓库配置(内部配置项顺序可颠倒)
<mirrors> <!--配置具体的仓库下载镜像--> <mirror> <!--此镜像的唯一标识,用来区分不同的mirror元素--> <id>alimaven</id> <!--镜像名称--> <name>aliyun maven</name> <!--镜像url--> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <!--对哪种仓库进行镜像,简单来说就是代替哪个仓库--> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
全局setting与用户setting
- 全局setting定义了当前计算机中Maven的公共配置
- 用户setting定义了当前用户的配置(当前用户有用户setting时,会覆盖全局setting),就像父类与子类的区别
第一个Maven项目(手动)
Maven工程目录结构
resources内放配置文件(main中与test中的配置文件可能会冲突,所以要分开放)
左侧java 右侧web
Maven项目构建命令(基础)
-
Maven构建命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分开
mvn compile #编译
mvn clean #清理
mvn test #测试
mvn package #打包
mvn install #安装到本地仓库
第一个Maven项目(IDEA自动版)
配置Maven
settings->Build,Execution,Deployment->Build Tools->Maven
创建Maven项目
new project->Maven->选择sdk->设置项目名称以及坐标->finash
坐标上面有说明
- 工程样式,其他需求可自行新建文件夹,右键文件夹选择 Mark Directory as 可自行更改文件夹样式
用Maven创建Java
new Module->勾选Create from archetype直接输quickstart->配置名称、坐标->配置maven路径->finash
用Maven创建web应用
new Module->勾选Create from archetype直接输webapp->设置名称、坐标->设置maven路径->finash
pom中添加tomcat插件
即前端tomcat不用再自己下载源文件了,直接配置即可
<!--构建-->
<build>
<!--设置插件-->
<plugins>
<!--具体的插件配置-->
<plugin>
<!--相关的坐标-->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--配置端口号跟路径 eg:端口号80 路径 /(空)-->
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
pom默认配置项说明
<!-- 指定pom的模型版本-->
<modelVersion>4.0.0</modelVersion>
<!-- 打包方式,web工程打包为war Java工程打包为jar-->
<packaging>pom</packaging>
<!-- 组织id-->
<groupId>com.example</groupId>
<!-- 项目id(名称)-->
<artifactId>springboot</artifactId>
<!-- 版本号 release(完成版) ,snapshot(开发板)-->
<version>0.0.1-SNAPSHOT</version>
<!--设置当前工程的所有依赖-->
<dependencies>
<!--具体的依赖 有的没有版本号version-->
<dependency>
<groupId></groupId>
<artifactId></artifactId>
</dependency>
</dependencies>
<!--parent用于引用父工程,此处引用spring boot 即从中央服务器下载spring boot文件-->
<parent>
<!--这是Spring Boot的父级依赖,这样当前的项目就是Spring Boot项目了。
spring-boot-starter-parent 是一个特殊的starter,它用来提供相关的Maven默认依赖。
使用它之后,常用的包依赖可以省去version标签。-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
依赖管理
依赖配置
-
依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
-
格式参照 pom默认配置项说明
-
使用dependencies与dependency进行依赖配置
依赖传递
-
依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
-
依赖传递的冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
注:声明优先中比较时两个资源的id不同,特殊优先中,比较的是两个id相同但版本号不同
可选依赖
私房钱,控制别人是否能用
- 可选依赖指对外隐藏当前所依赖的资源————不透明
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--默认为false 当为true时,其他引用该依赖的项目将看不到该配置项-->
<optional>true</optional>
</dependency>
排除依赖
主动权,主动断开不用, 解决冲突的常用方法
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本————不需要
<!--该配置项下有多个配置项,属于引用的那一种-->
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--排除依赖,不需要写版本号,直接排除所有的该配置-->
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
依赖范围
- 依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
- 作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
scope | 主代码 | 测试代码 | 打包 | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--配置依赖的可用范围,默认compile-->
<scope></scope>
</dependency>
依赖范围传递性(了解)
即作用范围取交集即可(看上表格)
- 带有依赖范围的资源在进行传递时,作用范围将受到影响(影响配置可见性)
左侧部分为项目二,第一行为项目一
当项目一中的某依赖类型为compile,项目二引用项目一,且将项目一配置为compile时,项目二中某项目的依赖类型依然为compile。以此类推
生命周期与插件
构建项目生命周期
生命周期的一般阶段:
compile->test-compile->test->package->install
- Maven构建生命周期描述的是一次构建过程经历了多少个事件
- Maven对项目构建的生命周期划分为3套
- clean:清理工作
- default:核心工作,例如编译、测试、打包、部署等
- site:产生报告,发布站点等
插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能
<!--构建-->
<build>
<plugins>
<plugin>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--介绍源码插件执行在什么地方 执行-->
<executions>
<!--具体执行-->
<execution>
<!--决定执行什么东西 比如jar 对源码打包-->
<goals>
<goal></goal>
</goals>
<!--设置执行位置(执行的生命周期过程)-->
<phase></phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
eg: