系列文章
2、SSM基础专项复习2——Spring 框架(1)-CSDN博客
3、SSM基础专项复习3——Spring框架(2)-CSDN博客
文章目录
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 安装
见我的另一篇博客
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)