JavaWeb(一) Maven

本文最后更新于:2023年2月28日 下午

1. Maven概述

Maven是一个项目管理工具,将项目开发和管理过程抽象成-个项目对象模型(Project Object Model, POM)。

作用

  • 项目构建

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

  • 依赖管理

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

  • 统一开发结构

    提供标准的、统一的项目结构

2. Maven下载安装

Apache-Maven

下载文件夹压缩包,免去安装。

目录结构

1
2
3
4
/bin 		运行文件
/boot 类加载器
/conf 配置文件
/lib 依赖jar包

idea内置Maven

位于 <path>\IntelliJ IDEA 2021.3.2\plugins\maven

bin 路径 <path>\IntelliJ IDEA 2021.3.2\plugins\maven\lib\maven3\bin

全局settings.xml路径 <path>\IntelliJ IDEA 2021.3.2\plugins\maven\lib\maven3\conf·

3. Maven基本概念

Maven仓库

Maven 仓库是项目中依赖的第三方库所在的位置。

Maven仓库的分类

  • 本地仓库

  • 远程仓库

    • 中央仓库

      Maven社区管理,存储绝大多数流行的开源构件。联网获取,无需配置。

    • 私服

      部门/公司范围内)局域网内代理所有外部的远程仓库,可从中央仓库获取资源,可存储具有版权的资源。速度快、稳定,需配置。

    • 其他公共库

Maven 依赖搜索顺序

  1. 从本地仓库查找构件,如果没有找到,跳到第 2 步,否则继续执行其他处理。
  2. 从中央仓库查找构件,如果没有找到,并且已经设置其他远程仓库,然后移动到第 4 步;如果找到,那么将构件下载到本地仓库中使用。
  3. 如果没有设置其他远程仓库,Maven 则会停止处理并抛出错误。
  4. 在远程仓库查找构件,如果找到,则会下载到本地仓库并使用,否则 Maven 停止处理并抛出错误。

Maven坐标

Maven坐标用于定位Maven仓库中资源的位置。

Maven坐标的组成

必要

  • groupid

    定义当前maven项目隶属的组织名称,一般是反写域名(顶级域名.公司.组织.个人.功能板块)。比如:com.alibaba.taotao

  • artifactId

    定义当前maven项目的名称(模块,一般为 项目名+子模块名)。比如:taobao-web

  • version

    定义当前maven项目当前所处版本。

非必要

  • packaging

    定义当前maven项目的打包方式

引入

查找资源相关信息:

进入 https://mvnrepository.com/ 搜索,复制 Maven下的配置代码。

3. Maven依赖管理

配置文件

优先级:pom.xml > 自定义settings.xml (.m2\) > 全局settings.xml (maven\conf)

settings.xml

Maven相关参数配置,如本地仓库、远程仓库的代理信息等。

如我们当前用到的本地仓库的位置、远程仓库的镜像配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd">
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<localRepository>[path]</localRepository>
</settings>

pom.xml

POM (Project Object Model) 代表项目对象模型,是 Maven 工程的基本工作单元包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

主要配置节点如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<!-- 基本配置 -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>

<!-- 依赖配置 -->
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>

<!-- 构建配置 -->
<build>...</build>
<reporting>...</reporting>

<!-- 项目信息 -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>

<!-- 环境设置 -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>

依赖配置

本地模块直接引入Maven坐标即可。

配置开源模块

查询网址:https://mvnrepository.com

搜寻依赖,粘贴代码至 pom.xml 即可完成依赖配置:

但想要使用依赖,需要先将jar包下载至本地仓库( settings.xmlLocalRepository 配置路径)

依赖传递

依赖具有传递性

Maven工程引入依赖的同时。也引入了依赖的依赖

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

解决依赖冲突:

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

4. Maven生命周期与插件

构建生命周期

Maven 构建生命周期定义了一个项目构建跟发布的过程。分为三个阶段,每个阶段也包含一个生命周期:

  • clean:项目清理的处理
  • default / build:项目部署的处理
  • site:项目站点文档创建的处理

clean生命周期

  1. pre-clean:执行一些需要在 clean之前完成的工作
  2. clean:移除所有上一次构建生成的文件
  3. post-clean:执行一些需要在clean之后立刻完成的工作

在一个生命周期中,运行某个阶段 (phase) 的时候,它之前的所有阶段都会被运行。

例如,执行 mvn clean 时,cleanpost-clean 都被执行。

default生命周期

比较重要的default阶段:

  1. validate:验证,验证项目是否正确且所有必须信息是可用的
  2. compile:编译,源代码编译
  3. test:测试,使用适当的单元测试框架(例如 JUnit)运行测试
  4. package:打包,将编译后的代码打包成可分发格式(例如jar/war
  5. install:安装,安装打包的项目到本地仓库,以供其他项目使用
  6. deploy:部署,拷贝最终的工程包到远程仓库中

插件

每个生命周期中都包含着一系列的阶段 (phase) ,相当于 Maven 提供的统一的接口,其实现由 Maven 的插件来完成。

例如,执行 mvn clean 时,clean 对应的就是 Clean 生命周期中的 clean 阶段。但是 clean 的具体操作是由 maven-clean-plugin 来实现的。

插件的调用

一个插件能实现多个目标 (goal),可由插件网址查询。因此,想实现某个插件的指定目标时,命令行为:

1
2
mvn <plugin>:<goal>
mvn compile:testCompile

插件的配置

1
2
3
4
5
6
7
8
9
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>

web 项目中配置 war 插件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>

其中,executions 节点的 goals 用于配置插件实现的目标,phase 用于配置插件对应的生命周期阶段。

参考资料


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!