SSM基础专项复习4——Maven项目管理工具(1)
系列文章
1、SSM基础专项复习1——SSM项目整合-CSDN博客
2、SSM基础专项复习2——Spring 框架(1)-CSDN博客
3、SSM基础专项复习3——Spring框架(2)-CSDN博客
文章目录
系列文章
1. Maven 的概念
1.1. 什么是 Maven
1.2. 什么是依赖管理
1.3. 什么是项目构建
1.4. Maven 的应用场景
1.5. 为什么使用 Maven
1.6. Maven 模型
2. 初识 Maven
2.1. Maven 安装
2.1.1 Maven 安装目录分析
2.2 按照约定创建 Maven 项目目录
2.3 Maven 项目视图
3、 Maven 进阶
3.1. pom.xml 文件
3.2. 坐标
3.2.1. 坐标的概念
3.2.2. 坐标的意义
3.2.3. 坐标的含义
3.3. 依赖
3.3.1. 依赖的意义
3.3.2. 依赖的使用
3.4. 依赖范围
3.5. 依赖传递和可选依赖
3.5.1. 依赖传递
3.5.2. 依赖范围对传递依赖的影响
3.5.3. 依赖阻断
3.5.4. 可选依赖
4、仓库
4.1 仓库的概念
4.2 依赖搜索顺序
1. Maven 的概念
1.1. 什么是 Maven
maven翻译为“专家”,“内行”
Maven 是跨平台的项目管理工具。主要服务于基于 Java 平台的项目构建,依赖管理和项目信息管理。
什么是理想的项目构建?
高度自动化,跨平台,可重用的组件,标准化的
什么是依赖?为什么要进行依赖管理?
在软件开发或其他项目管理情境中,依赖指的是一个组件、模块、库、服务或任务等对其他元素的依靠关系。自动下载,统一依赖管理。
A1.0 依托于 B 2.0 依托于 C3.0
在 Maven 项目中,依赖通过在
pom.xml
文件里的<dependencies>
标签下声明。每个依赖使用<dependency>
子标签定义,包含groupId
、artifactId
和version
这三个基本坐标,以此来唯一标识一个依赖项。
有哪些项目信息?
项目名称描述等,开发人员信息,开发者信息等
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
- Compile:编译依赖范围。默认使用此依赖范围,其下的 maven 依赖,对于编译,测试,运行 classpath 都有效。
- Test:测试依赖范围。只对测试 classpath 有效,编译主代码或运行项目时无法使用此依赖。典型例子如 junit。
- Provided:已提供依赖范围。其对于编译与测试 classpath 有效,运行时无效。如在 web 开发时,只有在编译和测试时才用到 servlet-api,将其设置为此范围,在运行时 servlet-api 由 web 容器提供,无须依赖。并且在打war 包时,此范围的依赖不会打在 WEB-INF/lib 下。
- Runtime:运行时依赖范围。与 provided 相对,运行时classpath 有效。典型例子如 jdbc(编写是接口规范运行是提供具体实现类需要jar 包)。
3.5. 依赖传递和可选依赖
3.5.1. 依赖传递
应用场景:
第一直接依赖: HelloFriend 项目依赖 Hello 项目
第二直接依赖: MakeFriend 项目依赖 HelloFriend 项目
3.5.2. 依赖范围对传递依赖的影响
传递依赖是会受到依赖范围的影响的,具体来看结果如下:
3.5.3. 依赖阻断
我们使用
<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)