Maven基础笔记

Maven基础

一. 简介

Maven的作用:

  1. 项目构建:提供标准的、跨平台的自动化项目构建方式

  2. 依赖管理:方便快捷的管理项目依赖资源(jar包),避免资源之间的版本冲突问题

  3. 统一开发结构:提供标准的、统一的项目结构

每一个项目都对应一个项目对象模型(POM),一个项目对象模型通过一份pom.xml文件进行管理,同时依赖管理可以管理项目中需要的依赖。本身这个项目也可以作为一个资源供其他项目作为依赖使用。

二.基础概念

1. 仓库

仓库:用于存储资源,包含各种jar包

仓库的分类:

  • 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
  • 远程仓库:非本地电脑上的仓库,为本地仓库提供资源
    • 中央仓库:Maven团队维护的,存储所有资源的仓库
    • 私服:部门或公司范围内部存储资源的仓库,从中央仓库获取资源

私服的作用:

  1. 保存具有版权的资源,包含购买或自主研发的jar包
  2. 一定范围内共享资源,仅对内部开放,不对外共享

2. 坐标

坐标:Maven中的坐标用于描述仓库中资源的位置

主要组成:

  • groupId:定义当前Maven项目隶属组织的名称(通常是域名反写,org.mybatis)
  • aritfactId:定义当前Maven项目的名称,通常为模块名称
  • version:当前项目版本号
  • packaging:当前该项目的打包方式

搜索:Maven Repository: Search/Browse/Explore (mvnrepository.com)

作用:使用唯一标识来定位资源的位置,通过该表示可以将资源的识别与下载工作交由机器来完成

本地仓库的配置,在conf里面的setting中配置

阿里云maven:

1
2
3
4
5
6
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

三.手工制作Maven项目

Maven工程目录结构:

1
2
3
4
5
6
7
8
9
- java-project
- src
- main
- java
- resources
- test
- java
- resources
- pom.xml
  • java文件夹中防止类代码
  • src同层目录中创建pom.xml

Maven项目构建命令:

1
2
3
4
5
6
#首先进入对应的java-project文件夹
mvn compile # 编译
mvn clean # 清理编译后的文件
mvn test # 测试
mvn package # 打包,包括了编译和测试
mvn install # 安装到本地仓库

可以插件创建Maven项目

四.IDEA生成Maven项目

通过配置在IDEA中的设置进行Maven项目的生成

五.依赖管理

1.依赖配置

依赖配置:配置当前项目需要的jar包,一个项目可以设置多个依赖

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 设置当前项目所依赖的所有jar-->
<dependencies>
<!—设置举例的依赖 -->
<dependency>
<!—依赖所属群组id-->
<groupId>junit</groupId>
<!—依赖所属项目id-->
<artifactId>junit</artifactId>
<!—依赖版本号-->
<version>4.12</version>
</dependency>
</dependencies>

2.依赖传递

依赖传递:使用其他人的资源的时候,那个资源有用到的jar包,当前项目中也能够使用

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被依赖的资源如果依赖其他资源,那么当前项目间接依赖其他资源

依赖冲突三原则(决定使用哪一个依赖)

  1. 路径优先:当依赖中出现了相同资源的时候,层级越深,优先级越低,层级越浅,优先级越高
  2. 声明优先:当资源在相同层级的时候,配置顺序靠前的覆盖配置顺序靠后的
  3. 特殊优先:当同一配置文件中了相同资源的不同版本,后配置的覆盖先配置的

3.可选依赖

可选依赖指对外隐藏当前资源所需要的依赖(对外不透明)

当前项目中配置可选依赖,当其他项目使用当前项目作为资源的时候,其他项目无法看到依赖。

使用optional关键字

1
2
3
4
5
6
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<optional>true</optional>
</dependency>

4.排除依赖

排除依赖指主动断开依赖的资源,被排除的依赖无需指定版本(自己不需要)

当前项目中配置排除依赖,则当前项目中就看不到对应使用资源的依赖

使用exclusionsexclusion关键字

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>

5.依赖范围

依赖范围:使用scope关键字,用来指定依赖的允许使用范围,分为以下的范围:

  • 主程序范围内有效(main文件夹范围)
  • 测试程序范围内有效(test文件夹范围)
  • 是否参与打包(package指令范围内)
scope 主代码 测试代码 打包
compile(默认)
test
provide
runtime

依赖范围有特殊的传递性:带有依赖范围的资源在进行传递的时候,作用范围会受到影响:

下面是对scope各种取值的相关解释:

  • compile:为默认的依赖范围,该依赖在编译、运行和测试时均有效
  • provide:在编译、测试时有效,但是在运行时无效。例如servlet-api,运行项目的时候容器已经提供了,就不需要重复引入
  • runtime:在运行、测试时有效,在编译时无效。例如JDBC驱动实现,项目代码编译仅需要JDBC接口,只有在测试或者运行项目的时候才需要实现接口的具体驱动
  • test:只在测试时有效

六.生命周期与插件

项目构建生命周期:Maven构建生命周期描述的是一次构建过程中经历了多少个事件。Maven对项目构建的生命周期划分为3套

  • clean:清理工作
  • default:核心工作,例如编译,测试,打包,部署等
  • site:产生报告,发布站点等

插件:

  • Maven生命周期的每一个阶段的具体实现都是由Maven插件来实现的。而Maven实际上是一个依赖插件执行的框架
  • 插件与生命周期内的阶段绑定,在执行到对应生命周期的时候会执行对应的插件功能
  • 默认maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义功能

Maven基础笔记
http://example.com/2022/06/27/Maven基础笔记/
作者
EverNorif
发布于
2022年6月27日
许可协议