maven笔记

maven介绍和作用

Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。

主要作用的理解:

依赖管理:

在编写项目时我们需要许多第三方依赖,有maven后子需要将依赖项的信息编写到Maven工程的配置文件,Maven软件会自动下载并复制这些依赖到项目中,也会自动下载依赖所需要的依赖(确保依赖版本无误)

构建管理:

项目开发后想要将项目打包成.war文件,并部署到服务器中运行;使用maven可以通过一行构建命令(mvn package)快速构建和打包

idea 也可以构建项目,为什么要使用 maven 呢?

原因1:maven构建触发方便

原因2:开发项目的软件有很多,每个软件的项目结构都不相同,使用maven构建可以统一结构

Packaging定义规则:

指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型!

packaging 属性为 jar(默认值),代表普通的Java工程(Java类文件,资源文件),打包以后是.jar结尾的文件。

packaging 属性为 war,代表Java的web工程(Java文件,jsp文件,html/cssjs文件,配置文件),打包以后.war结尾的文件。

packaging 属性为 pom,代表不会打包,用来做继承的父工程。

依赖管理

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<!--gavp属性,不会改变-->

<groupId>com.atguigu</groupId>

<artifactId>maven-javase-project-02</artifactId>

<!--构建过程,部署时修改-->

<version>1.0-SNAPSHOT</version>

<!--maven工程的打包方式 java jar默认值; web war; 不打包 pom-->

<packaging>war</packaging>

<!--第三方依赖信息

dependencies -项目依赖信息的集合

dependency -每个依赖项

gav -依赖的信息就是其他被打包成maven的工程(该工程被打包成jar)

如何知道第三方依赖的信息呢?

1 使用官网查询 http://mvnrepository.com

2 使用插件 maven-search

点击tools(工具) -maven-search 直接搜索插件即可

扩展:

1 提取版本号统一管理(自定义一个标签提取版本号到该标签)------------------------properties<>中设置

2 可选属性scope------------------设置在dependency中(标明依赖可以使用的范围)

scope------------引入依赖的作用

默认是compile 代表该依赖可以在main中使用,也可以在test中使用,在打包和运行时都有效

设置为test 该依赖只能在test中使用(例如单元测试方法的依赖)

设置为runtime main中不会用,test不会用 在打包和运行时会使用(一般是反射的时候使用)

例如:mysql Class.format(com.mysql.cj.jdbc.Driver)

设置为provided 在main中会使用,在test中会使用,在打包和运行时会使用 例如:Servlet

总结:scope是一种锦上添花的手段,如果掌握不好,就全部默认值

-->

<!--声明版本号-->

<properties>

<!--统一管理

声明一个变量来接收版本号,变量声明以后,在其他位置可以引用 ${jackson.version(变量名)}

注意:声明的标签建议两层以上命名,推荐 技术名.version

-->

<jackson.version>2.18.2</jackson.version>

</properties>

<dependencies>

<dependency>

<!--定位信息gav三个属性是必须的-->

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-core</artifactId>

<version>${jackson.version}</version>

<scope>compile</scope>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.13.2</version>

<scope>test</scope>

</dependency>

</dependencies>

</project>

依赖传递与依赖冲突

**依赖传递**指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时,构建工具(如 Maven、Gradle)会自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用。

依赖传递:导入依赖会自动导入依赖的依赖!(compile dependenices)

简化依赖的导入,确保依赖的版本无冲突

依赖冲突:发现要导入已经存在的依赖(重复依赖)会终止依赖传递!避免循环依赖和重复依赖问题

依赖冲突发生场景:重复依赖

例如

A------需要 B 1.0

C------需要 B 2.0

现要导入A与C依赖那么B应该是那个版本

依赖冲突解决原则:

第一原则:谁短谁优先(看应用的路径长度)

A-C-B1.0

F-B2.0

那么导入的应该是 A C F B2.0

第二原则:谁上谁优先(看dependencies声明的先后顺序)

A-B1.0

F-B2.0

那么导入应该是A,F,B1.0

注意:只要发生冲突了,后续的依赖传递全部终止

前提:

A 1.1 -> B 1.1 -> C 1.1

F 2.2 -> B 2.2

pom声明:

F 2.2

A 1.1

B 2.2

那么会得到F2.2,B2.2,A1.1 (不会引入C1.1,只要发生冲突了,后续的依赖传递全部终止!)

依赖传递的作用是: --------------------------------- 自动导入依赖的依赖

  1. 减少重复依赖:当多个项目依赖同一个库时,Maven 可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。

  2. 自动管理依赖: Maven 可以自动管理依赖项,使用依赖传递,简化了依赖项的管理,使项目构建更加可靠和一致。

  3. 确保依赖版本正确性:通过依赖传递的依赖,之间都不会存在版本兼容性问题,确实依赖的版本正确性

依赖冲突 ------------------------- 当发生重复依赖导入会终止依赖传递

maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择

依赖下载失败解决方案

解决方案:

  1. 检查网络连接和 Maven 仓库服务器状态。

  2. 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。

3.清除本地 Maven 仓库缓存 (lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!

构建管理

构建概念 :

项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。

主动触发场景:

  • 重新编译 : 编译不充分, 部分文件没有被编译!

  • 打包 : 独立部署到外部服务器软件,打包部署

  • 部署本地或者私服仓库 : maven工程加入到本地或者私服仓库,供其他工程使用

构建步骤

命令方式构建:

语法: mvn 构建命令 构建命令....

注意:

1命令执行需要我们进入到项目的根路径

2部署必须时jar包形式

可视化方式构建 .

构建命令周期:触发周期后的命令会自动触发同一周期前的命令!

作用:是一种简化触发构建命令过程

是一个有序的构建命令容器

**清理周期:**clean

**构建周期:**compile test package install/deploy

**报告周期:**site

例如:想要打包,就直接package即可,不需要compile test package (因为会自动触发执行compile与test 但不会触发clean ) 故而打包的最佳方案应是mvn clean package

我们执行的是周期命令

继承与聚合

继承特性的理解

继承概念:

Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。

继承作用

作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理!

它的背景是:

  • 对一个比较大型的项目进行了模块拆分。

  • 一个 project 下面,创建了很多个 module。

  • 每一个 module 都需要配置自己的依赖信息。

它背后的需求是:

  • 多个模块要使用同一个框架,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一管理。

通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。

例如:

在一个父工程下不同子工程需要同一个依赖的版本不同;可以在父工程中声明版本,

思路一:直接在父工程中引入依赖<dependenies <denpendency gav(会出现子工程会将不需要的依赖也导入进来)

思路二:父工程引入依赖,只做依赖版本的声明 <dependeniesManagement <dependenies <denpendency gav(专门为版本管理声明,不会正真导入依赖,只会做一个配置的声明)---------------------------在子工程中导入依赖时就只需要写ga即可不需要再声明版本了

聚合关系实现和作用

1. 聚合概念------------------------------------(统一构建 : 在父工程中构建就可以触发子工程)

Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!

2. 聚合作用

  1. 统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。

  2. 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。

相关推荐
fanged几秒前
C++的汇编实现(TODO)
笔记
掉鱼的猫11 分钟前
Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
java·http
shehuiyuelaiyuehao12 分钟前
多线程入门
java·python·算法
星夜夏空9912 分钟前
FreeRTOS学习(7)——任务列表
java·前端·学习
不羁的木木14 分钟前
Form Kit(卡片开发服务)学习笔记01-核心概念与架构设计
笔记·学习·harmonyos
han_hanker19 分钟前
BeanUtils.copyProperties 和序列化的问题
java·开发语言·spring boot
野生技术架构师21 分钟前
牛客网2026互联网大厂Java面试题汇总,附官方级答案解析
java·开发语言
不羁的木木22 分钟前
ArkWeb实战学习笔记01-核心概念与架构设计
笔记·学习·harmonyos
大明者省1 小时前
IIS 端口绑定正常访问的原理说明与常见误区澄清
运维·服务器·笔记
AZaLEan__1 小时前
多源 BFS
java·开发语言·算法