Maven基础应用

概述

1 简介

背景:我们在做项目时。一个项目中常常有许多的不同种类的文件,难以管理。在多人开发一个项目时,每个人的项目结构也不一样,对于后期的整合也是一个大问题。在我们开发时,会用到许多的依赖,那么对于依赖的导入和管理也是一个棘手的问题。在这样的背景下,出现了许多的项目管理工具。现在常用的便是Maven。

Maven:由背景我们就能知道Maven是一个项目管理工具。

2 作用

  • 项目构建:提供骨架,便于开发者统一项目结构,便于开发。
  • 依赖管理:Maven能够方便快捷的管理依赖。
  • 提供标准:开发者都Maven,久而言之。Maven便提供了标准的项目结构。

基础概念

1 仓库

仓库就是装东西的。在Maven中,我们要仓库有什么用?仓库在哪里?

在背景中已经提到,Maven可以管理依赖。所以能够猜测出仓库就是用来存放依赖。

仓库的分类:

  1. 远程仓库:非本机上存储依赖的仓库。连接本地仓库,为本地仓库提供依赖。

    分类:

    1. 中央仓库:由Maven开发人员管理和维护,里面拥有绝大部分的开源依赖
    2. 私服:由企业或个人创建的远程仓库。从中央仓库获取依赖,或者自己上传依赖。
  2. 本地仓库:本机上用于存储依赖的仓库。

  1. 私服用来存储自己研发的依赖,保护自己的版权。
  2. 用于团队直接互相传递自己研发的依赖。

下图为仓库的工作流程图。

本地仓库获取依赖由三种方法:

  1. 从私服中获取,私服的服务器一般在国内,获取依赖的速度快。
  2. 直接从中央仓库中获取。但是中央仓库的服务器在国外,获取速度很慢,不推荐使用此方法。
  3. 自己导入,下载对于的依赖后,手动添加到对于的文件目录下。

2 坐标

坐标就要用来确定位置的。那么在Maven中哪里要用到坐标呢?坐标的出现是为了精确地找到对应的物品。在仓库中,存在着众多的依赖。找起来是十分麻烦。所有就用坐标来定位我们需要的依赖。

Maven坐标的组成部分:

1
2
3
4
5
<dependency>
<groupId>XXX</groupId>
<artifactId>XXX</artifactId>
<version>XXX</version>
</dependency>

其中各参数为:

  • groupId:定义当前Maven隶属组织名称(通常情况下为域名 反写,如:com.mybatis)
  • artifactId:定义当前Maven项目的名称(通常是模块名称,如CRM,SMS)
  • version:定义当前版本的版本号
  • packaging:定义当前项目的打包方式(如:jar,war)
1
2
3
4
5
mvn compile			#编译
mvn clean #清理
mvn test #测试
mvn package #打包
mvn install #安装到本地仓库

依赖管理

1 依赖传递

分类:

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

如图:

  • test2.jar对于test1.jar就是直接依赖
  • test3.jar对于test1.jar就是间接依赖

2 可选依赖

可选依赖:对外隐藏自己所依赖的依赖包

  • 只需在添加依赖时,添加<optional>true</optional>
  • optional的默认值为false,即不隐藏自己所依赖的jar包
1
2
3
4
5
6
<dependency>
<groupId>XXX</groupId>
<artifactId>XXX</artifactId>
<version>XXX</version>
<optional>true</optional>
</dependency>

3 排除依赖

排除依赖:主动断开依赖的资源,被排除的资源无需指定版本

  • 在直接依赖下面添加exclusions标签
  • 如下:在test1中导图test2依赖,但是要断开test3依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
# 此为test1项目的pom.xml文件

<dependency>
<groupId>tk.wian</groupId>
<artifactId>test2</artifactId>
<versoio>1.2.2</versoio>
<exclusions>
<exclusion>
<groupId>tk.wian</groupId>
<artifactId>test3</artifactId>
</exclusion>
</exclusions>
</dependency>

4 依赖范围

  • 依赖的jar默认情况下是compile,即任何地方都能使用。但是在实际开发中并不是所有的依赖在所有的地方都有使用。

  • 通过scope标签设定依赖的作用范围

  • 作用范围

    • 全部范围有效

    • 主程序范围有效(main文件范围内)

    • 测试程序范围有效(test文件范围内)

    • 是否参与打包(package指令范围内)

scope 主代码 测试代码 打包
compile Y Y Y
test Y
provided Y Y
runtime Y
  • 依赖范围的传递性:只有能够参与打包的依赖才能传递
compile test provided runtime
compile compile test provided runtime
test
provided
runtime runtime test provided runtime

生命周期

生命周期注意分为三类:

  • clean
  • default
  • site

  1. default周期(重点):

    • compile 编译项目的源代码
    • test 使用合适的单元测试框架运行测试(junit便是其一)
    • package 将编译后的代码打包。格式为jar,war等
    • install 安装项目包到本地仓库,可以作为本地项目的依赖

    该周期有很多,只说明了其中的常用几个。

  2. clean周期:

    • pre-clean 执行一些需要在clean之前完成的工作

    • clean 移除所有上一次构建生成的文件

    • post-clean 执行一些需要在clean之后立刻完成的工作

  3. site周期:

    • pre-site 执行一些需要在站点生成文档之前的工作

    • site 生成项目所需要的站点文档

    • post-site 执行一些需要在生成站点文档之后完成的工作,并为部署做准备

    • site-deploy 将生成的站点文档部署到特定的服务器上

插件

  • 插件与生命周期内的阶段绑定,在执行到对应的生命周期时执行对应的插件
  • 默认Maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能

导入插件格式如下:

1
2
3
4
5
6
7
<bulid>
<plugin>
<groupId>XXX</groupId>
<artifactId>XXX</artifactId>
<version>XXX</version>
</plugin>
</bulid>
如果有什么,可以通过下面的邮箱和我联系!!!

img