SSM基础专项复习4——Maven项目管理工具(1)

系列文章

1、SSM基础专项复习1------SSM项目整合-CSDN博客

2、SSM基础专项复习2------Spring 框架(1)-CSDN博客

3、SSM基础专项复习3------Spring框架(2)-CSDN博客

文章目录

系列文章

[1. Maven 的概念](#1. Maven 的概念)

[1.1. 什么是 Maven](#1.1. 什么是 Maven)

[1.2. 什么是依赖管理](#1.2. 什么是依赖管理)

[1.3. 什么是项目构建](#1.3. 什么是项目构建)

[1.4. Maven 的应用场景](#1.4. Maven 的应用场景)

[1.5. 为什么使用 Maven](#1.5. 为什么使用 Maven)

[1.6. Maven 模型](#1.6. Maven 模型)

[2. 初识 Maven](#2. 初识 Maven)

[2.1. Maven 安装](#2.1. Maven 安装)

[2.1.1 Maven 安装目录分析](#2.1.1 Maven 安装目录分析)

[2.2 按照约定创建 Maven 项目目录](#2.2 按照约定创建 Maven 项目目录)

[2.3 Maven 项目视图](#2.3 Maven 项目视图)

[3、 Maven 进阶](#3、 Maven 进阶)

[3.1. pom.xml 文件](#3.1. pom.xml 文件)

[3.2. 坐标](#3.2. 坐标)

[3.2.1. 坐标的概念](#3.2.1. 坐标的概念)

[3.2.2. 坐标的意义](#3.2.2. 坐标的意义)

[3.2.3. 坐标的含义](#3.2.3. 坐标的含义)

[3.3. 依赖](#3.3. 依赖)

[3.3.1. 依赖的意义](#3.3.1. 依赖的意义)

[3.3.2. 依赖的使用](#3.3.2. 依赖的使用)

[3.4. 依赖范围](#3.4. 依赖范围)

[3.5. 依赖传递和可选依赖](#3.5. 依赖传递和可选依赖)

[3.5.1. 依赖传递](#3.5.1. 依赖传递)

[3.5.2. 依赖范围对传递依赖的影响](#3.5.2. 依赖范围对传递依赖的影响)

[3.5.3. 依赖阻断](#3.5.3. 依赖阻断)

[3.5.4. 可选依赖](#3.5.4. 可选依赖)

4、仓库

[4.1 仓库的概念](#4.1 仓库的概念)

[4.2 依赖搜索顺序](#4.2 依赖搜索顺序)


1. Maven 的概念

1.1. 什么是 Maven

maven翻译为"专家","内行"

Maven 是跨平台的项目管理工具。主要服务于基于 Java 平台的项目构建,依赖管理和项目信息管理。

什么是理想的项目构建?

高度自动化,跨平台,可重用的组件,标准化的

什么是依赖?为什么要进行依赖管理?

在软件开发或其他项目管理情境中,依赖指的是一个组件、模块、库、服务或任务等对其他元素的依靠关系。自动下载,统一依赖管理。

A1.0 依托于 B 2.0 依托于 C3.0

在 Maven 项目中,依赖通过在 pom.xml 文件里的 <dependencies> 标签下声明。每个依赖使用 <dependency> 子标签定义,包含 groupIdartifactIdversion 这三个基本坐标,以此来唯一标识一个依赖项。

有哪些项目信息?

项目名称描述等,开发人员信息,开发者信息等

1.2. 什么是依赖管理

对第三方依赖包的管理,可以连接互联网下载项目所需第三方 jar 包。对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。

我们可以在maven的中央仓库找到对应的jar包

maven仓库地址https://mvnrepository.com/

1.3. 什么是项目构建

项目构建:是一个从编写源代码到编译、测试、运行、打包、部署的过程。

传统项目和 maven 项目构建的两种方式

传统项目: 打开 Idea 编写源代码和配置文件,对源代码进行编译,可以使用Junit 进行单元测试,把项目打成 war 包,部署到 Tomcat 服务器中运行。

maven 项目: maven 将项目构建过程进行标准化,每个阶段都可以使用一个命令来完成。

清理 --> 编译 --> 测试 --> 报告 --> 打包 --> 部署

**使用maven的好处:**可以通过命令完成项目构建。(测试:使用 mvn tomcat:run 的命令来发布运行项目)maven 对每个构建阶段进行规范,有利于大型团队协作开发。

1.4. Maven 的应用场景

maven 的应用场景,开发人员只要按着 maven 标准的目录结构进行开发即可,然后提交代码。在测试服务器上拉取 Java 源码,然后可以使用 maven 的自动化项目构建完成项目的清理、编译、测试、打包和安装部署等。

1.5. 为什么使用 Maven

IDE?Eclipse?IDEA?

  • 手工操作较多,编译、测试、部署等工作都是独立的,很难一步完成
  • 每个人的 IDE 配置都不同,很容易就出错出现本地代码换个地方编译

Ant?

  • 没有一个约定的目录结构
  • 必须明确让 ant 做什么,什么时候做,然后编译,打包
  • 没有生命周期,必须定义目标及其实现的任务序列
  • 没有集成依赖管理

Ant 是一个基于 Java 的构建工具,由 Apache 软件基金会开发和维护。它主要用于自动化软件项目的构建过程,比如编译源代码、运行测试、生成文档以及打包部署等任务

Maven?

  • 拥有约定,知道你的代码在哪里,放到哪里去
  • 拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程
  • 只需要定义一个 pom.xml,然后把源码放到默认的目录,Maven 帮你处理其他事情
  • 拥有依赖管理,仓库管理

1.6. Maven 模型

2. 初识 Maven

2.1. Maven 安装

见我的另一篇博客

Maven的安装------给Idea配置Maven_idea 安装maven-CSDN博客文章浏览阅读2.4k次,点赞31次,收藏26次。Maven是一个开源的项目管理工具,它主要用于Java项目的构建、依赖管理和项目生命周期管理。_idea 安装mavenhttps://blog.csdn.net/2301_78566776/article/details/143890988?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220e9d5300004d38107b49caf0c8057837%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=0e9d5300004d38107b49caf0c8057837&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-143890988-null-null.nonecase&utm_term=maven&spm=1018.2226.3001.4450

2.1.1 Maven 安装目录分析

**bin:**含有 mvn 运行的脚本

**boot:**含有 plexus-classworlds 类加载器框架

**conf:**含有 settings.xml 配置文件

lib:含有 Maven 运行时所需要的 java 类库 LICENSE.txt, NOTICE.txt, README.txt 针对 Maven 版本,第三方软件等简要介绍

2.2 按照约定创建 Maven 项目目录

src/main/java------ 存放项目的.java 文件

src/main/resources ------ 存放项目资源文件,如 spring, mybatis配置文件

src/test/java------ 存放所有测试.java 文件,如 JUnit 测试类

src/test/resources------ 测试资源文件

target------ 项目输出位置

pom.xml------配置依赖的位置

2.3 Maven 项目视图

Maven 项目视图主要用于查看该 maven 项目的各项属性,同时也可以进行一些常见的maven 的操作,比如打包,清理,测试等等;

3、 Maven 进阶

3.1. pom.xml 文件

就像 Make 的 MakeFile、Ant 的 build.xml 一样,Maven 项目的核心是pom.xml。POM( Project Object Model,项目对象模型 ) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

3.2. 坐标

3.2.1. 坐标的概念

在 Maven 中 坐 标 是 构 件 的 唯 一 标 识 , Maven 坐 标 的 元素包括groupId、artifactId、version、packaging、classifier。上述 5 个元素中,groupId、artifactId、version 是必须定义的,packaging 是可选的 ( 默认为jar )。

3.2.2. 坐标的意义

Maven 世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范 拥有了统一规范,就可以把查找工作交给机器

3.2.3. 坐标的含义

**groupId:**组织标识,一般为:公司网址的反写+项目名

**artifactId:**项目名称,一般为:项目名-模块名

**version:**版本号 形式为 0.0.1-SNAPSHOT:

第一个 0 表示大版本号,第二个 0 表示分支版本号,第三个0 表示小版本号

SNAPSHOT -- 快照版本,ALPHA -- 内侧版本,BETA -- 公测版本,RELEASE -- 稳定版本,GA -- 正式发布

**packaging:**打包的方式,如:pom, jar, maven-plugin, ejb, war,...

clissifier:用来帮助定义构件输出的一些附属构件。

3.3. 依赖

3.3.1. 依赖的意义

当编写 Java 代码时,我们总是需要一些库,例如,做单元测试我们需要JUnit库。对于更大的项目,我们可能需要创建自己的库并在不同的部分使用它的项目。不同的项目需要不同版本的库。 保持项目最新的库 JAR 文件的正确版本不是一个容易的任务。

每个外部 JAR 可能还依赖于其他外部 JAR 文件等。以递归方式下载所有这些外部依赖JAR 文件并确保下载正确的版本是一项巨大的任务。

当项目越来越大,我们将需要越来越多的外部依赖。

Maven 将下载它们并将它们放在您的本地 Maven 存储库中。 我们可以在 POM 文件中的 dependencies元素内指定依赖关系。

3.3.2. 依赖的使用

例如我们的项目需要进行单元测试,则需要使用到 junit-4.9.jar 包,使用maven引用该依赖的方式如下:

属性说明:

  • 三维坐标:引用依赖包的三维坐标,用来定位该依赖包;
  • scope: 控制该依赖包在什么情况下会被加到 classpath 中;

3.4. 依赖范围

Maven 项目在开发工程中有三套 classpath

**主代码:**main 下面的都是主代码在编译的时候的依赖

测试代码:test 下是测试代码编译的时候的依赖

**运行时:**main 代码在运行的时候对包的依赖

依赖范围的使用,通过在引用第三方依赖时的标签进行设置,例如:

共 6 种 scope,包括:compile、provided、runtime、test、system、import。例如上图的 junit,只在测试中使用,则选择 test 即可,默认为 compile

  1. Compile:编译依赖范围。默认使用此依赖范围,其下的 maven 依赖,对于编译,测试,运行 classpath 都有效。
  2. Test:测试依赖范围。只对测试 classpath 有效,编译主代码或运行项目时无法使用此依赖。典型例子如 junit。
  3. Provided:已提供依赖范围。其对于编译与测试 classpath 有效,运行时无效。如在 web 开发时,只有在编译和测试时才用到 servlet-api,将其设置为此范围,在运行时 servlet-api 由 web 容器提供,无须依赖。并且在打war 包时,此范围的依赖不会打在 WEB-INF/lib 下。
  4. Runtime:运行时依赖范围。与 provided 相对,运行时classpath 有效。典型例子如 jdbc(编写是接口规范运行是提供具体实现类需要jar 包)。

3.5. 依赖传递和可选依赖

3.5.1. 依赖传递

应用场景:

第一直接依赖: HelloFriend 项目依赖 Hello 项目

第二直接依赖: MakeFriend 项目依赖 HelloFriend 项目

3.5.2. 依赖范围对传递依赖的影响

传递依赖是会受到依赖范围的影响的,具体来看结果如下:

3.5.3. 依赖阻断

我们使用

XML 复制代码
<optional>true</optional>

例如我们在 HelloFriend 项目里面的 Hello 依赖处添加该配置

则 makeFriend 项目里面就不会再引入 Hello 的依赖

3.5.4. 可选依赖

如果我们需要在依赖中明确的排除掉某一依赖,则可以使用 exclusion 属性,排除掉引用的依赖,如图:

4、仓库

4.1 仓库的概念

在 Maven 的术语中,仓库是一个位置(place)。

Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。

在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 仓库能帮助我们管理构件(主要是 JAR),它就是放置所有JAR 文件(WAR,ZIP,POM 等等)的地方。 仓库的类型有:

 本地(local)  中央(central)  远程(remote)

4.2依赖搜索顺序

相关推荐
“抚琴”的人8 分钟前
C#—线程池详解
开发语言·c#
信徒_18 分钟前
java 中判断对象是否可以被回收和 GCROOT
java·开发语言·jvm
胖哥真不错27 分钟前
Python基于Django和协同过滤算法实现电影推荐系统功能丰富版
开发语言·python·django·项目实战·电影推荐系统·协同过滤算法·功能丰富版
多多*1 小时前
浅谈Mysql数据库事务操作 用mybatis操作mysql事务 再在Springboot中使用Spring事务控制mysql事务回滚
java·数据库·windows·github·mybatis
weixin_307779131 小时前
Python和Docker实现AWS ECR/ECS上全自动容器化部署网站前端
开发语言·python·云计算·aws
Ttang231 小时前
SpringBoot(4)——SpringBoot自动配置原理
java·开发语言·spring boot·后端·spring·自动配置·原理
苏雨流丰1 小时前
Java中按照不同字段进行排序
java·开发语言
神仙别闹1 小时前
基于Java+MySQL实现的医药销售管理系统
java·开发语言·mysql
m0_555762902 小时前
QT CSS 选择器
开发语言·css·qt
匹马夕阳2 小时前
Vite项目中vite.config.js中为什么只能使用process.env,无法使用import.meta.env?
开发语言·前端·javascript