遇见1995

《Maven实战》

《Maven实战》阅读总结(一)

本文是对《Maven实战》一书,阅读笔记的总结。

Maven简介

Maven 主要用于 Java 项目构建、依赖管理和项目信息管理。能够帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。Maven 减轻了 构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件。

简单的来说,Maven 是一个 构建工具、依赖管理工具、项目信息管理工具。

构建:编译、运行单元测试、生成文档、打包和部署。

扩展——同类软件

  • Make:很难跨平台构建。
  • Ant(Another Neat Tool):跨平台,使用xml定义构建脚本。
  • Grable

核心概念

  • pom(Project Object Model):项目对象模型。
  • modelVersion:模型版本(Maven2/3 只能是 4.0.0)
  • groupId:项目,那个组,通常为域名倒序,例如 yujian95.cn -> cn.yujian95
  • artifactId:模块,组内唯一ID
  • version:版本号,SNAPSHOT(快照,即不稳定版本)
  • name:项目名
  • package:打包方式,可选:pom、war、jar(默认)
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.yujian95.little</groupId>
<artifactId>little</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>little</name>
<description>Little project for Spring Boot</description>
</project>
  • dependencies:依赖列表
  • dependency:依赖包
  • groupId、artifactId、version:基本坐标,同上
  • type:依赖类型,同 package,jar(默认,可不填)
  • exclusions:排除传递性依赖(排除依赖)
  • optional:是否可选;可选依赖,只对当前项目有效,不会该依赖不会被传递
  • scope:依赖范围,compile、test、provided、runtime、system、import(详情如下)
依赖范围 对于编译有效 对测试有效 对运行时有效 例子
compile(默认) Y Y Y spring-core
test Y JUnit
provide Y Y servlet-api
runtime Y Y JDBC
system Y Y 本地的类库文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<scope>compile</scope>
<type>jar</type>
<exclusions>
<!--需要排查的依赖-->
<dependency>xxx</dependency>
<artifactId>xxx</artifactId>
<version>xxx</version>
</exclusions>
<!--需要排查的依赖-->
<optional>true</optional>
</dependency>
</dependencies>

Maven 属性

  • properties,统一管理依赖版本。(归类依赖)
1
2
3
4
5
6
7
8
9
10
11
<properties>
<hutool.version>4.5.7</hutool.version>
</properties>

<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>

传递性依赖

  1. 路径最近者优先。(依赖传递层数越少的优先)
  2. 第一声明优先。(依赖传递层数相同时,声明顺序越前的优先)

优化依赖

Maven 会自动解析所有项目的直接依赖和传递性依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在。在这些工作之后,最后得到了的那些依赖被称为已解析依赖。mvn dependency:list 查看,mvn dependency:analyze 依赖分析(查看声明未使用依赖/使用未声明依赖)

  • 显式声明任何项目中直接用到的依赖。

仓库

仓库,即存放构件的地方。减少磁盘浪费、便以统一管理。大致分成俩类,远程仓库和本地仓库,还有一种特殊的远程仓库(私服,减少宽带、下载时间、存放内部构件)。

构件,在Maven中,任何一个依赖、插件或者项目构建的输出,都可称做构件。

遵循坐标机制,Maven将可以容易的找到对应的构件。

例如:log4j:log4j:1.2.15->log4j/log4j/1.2.15/log4j-1.2.15.jar

当Maven使用构件的时候,会先在本地仓库查找是否存在该构件,有则直接使用;如果不存在的话,会从远程仓库下载构件,或者查看新版本。如果都没有的话,Maven就会报错。

setting.xml

在本地仓库conf目录下,我们可以通过配置setting.xml修改本地仓库位置,还可以配置认证信息访问私服。

此外,因为国内访问中央仓库比较慢,一般来说,会通过配置国内镜像仓库,提高访问速度。

  • <mirrorOf>*</mirrorOf> :匹配所有远程仓库。
  • <mirrorOf>external:*</mirrorOf>:匹配所有远程仓库,除 localhost之外。
  • <mirrorOf>repo1,repo2</mirrorOf>:匹配 repo1repo2仓库。
  • <mirrorOf>*,! repo1</mirrorOf>:匹配所有远程仓库,除 repo1外仓库。
1
2
3
4
5
6
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>

部署构件至远程仓库

我们可以在pom.xml 通过distributionManagement将构件部署到远程仓库,运行 mvn clean deploy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<distributionManagement>
<!--发布版本-->
<repository>
<id>little</id>
<name>little-release</name>
<url>http://yujian.cn/xxx</url>
</repository>
<!--快照版本-->
<snapshotRepository>
<id>little</id>
<name>little-snapshot</name>
<url>http://yujian.cn/xxx</url>
</snapshotRepository>
</distributionManagement>
  • LATEST:最新版本
  • RELEASE:最新发布版本

常用命令

  • clean:清除原有构件。

  • install:将项目的构建输出文件安装到本地仓库。

  • deploy:部署构件。

1
2
mvn clean install
mvn clean package

生命周期

依赖加载规则

继承和聚合

需要注意的点

引用

Maven 实战


本文发表于 2020-10-21,最后修改于 2020-11-17。

本站永久域名yujian95.cn,也可搜索「 遇见1995 」找到我。

期待关注我的微信公众号「 编程图解 」 ,查看最近的文章和动态。


上一篇 « 集成 Spring Boot Admin 实现 Spring Boot 应用监控

赞赏支持

请我吃包子 =^_^=

i ali

支付宝

i wechat

微信

推荐阅读

Big Image