一文快速了解 Maven

前沿:六年代码人,近期开始做一些技术分享,欢迎大家一起交流学习啊 。。。。
近期在用 mvn assembly 重新编译一个工程,这次将 maven 相关的一些知识以及这次遇到的问题做了一个整理分享给大家。

Maven 是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有重要作用。Maven 是一款在大型项目开发过程中不可或缺的重要工具。
1.Maven 的作用
1.1.对于比较庞大的项目,可以将一个项目拆分成多个工程模块,便于分工协作。
1.2.借助Maven,可以将jar包仅仅保存在“仓库”中;有需要的工程“引用”这个文件接口,并不需要真的把jar保存在工程中,这样既不浪费存储空间,也让工程不那么臃肿。
1.3.借助于Maven以一种规范的方式下载jar包。
1.4.Maven会将项目jar包依赖的jar包自动导入进来。

2.Maven 构建过程中的各个环节
①清理:删除以前的编译结果(旧的class字节码文件),为重新编译做好准备。
②编译:将 Java 源程序编译为class字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性(自动测试、自动调用junit程序)。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web
工程对应 war 包。
⑥安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。

3.安装 Maven 核心程序(往上有很多教程,需要者自行查找)
① 检查 JAVA_HOME 环境变量

rxymac@AppledeMBP:~$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home

②解压Maven核心程序的压缩包,放在一个非中文无空格的路径下

/Users/rxymac/install/module/apache-maven-3.8.1

③配置Maven相关的环境变量

vi .bash_profile
#maven
export Maven_Home=/Users/rxymac/install/maven
export PATH=${PATH}:${Maven_Home}/bin

注:我这为了方便管理,建了个链接到原maven安装目录,所以②和③路径不一样,实际上是一样的,详情如下:

rxymac@AppledeMBP:~/install$ ll maven
lrwxr-xr-x  1 rxymac  staff  47  7 19 11:22 maven@ -> /Users/rxymac/install/module/apache-maven-3.8.1

④验证:运行mvn -v命令查看Maven版本

rxymac@AppledeMBP:~/install$ mvn -v
Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: /Users/rxymac/install/maven
Java version: 1.8.0_211, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"

4.Maven 核心概念
Maven 能够实现自动化构建是和它的内部原理分不开的,这里我们从 Maven 的九个核心概念入手,
看看 Maven 是如何实现自动化构建的
①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合

4.1.POM
Project Object Model:项目对象模型。将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。
Maven 工程的核心配置。可以说学习 Maven 就是学习 pom.xml 文件中的配置。

4.2.约定的目录结构
[1]根目录:工程名
[2]src目录:源码
[3]main目录:存放主程序
[4]test目录:存放测试程序
[5]java目录:存放Java源码
[6]resources目录:存放框架和其他工具的配置文件
[7]pom.xml文件:Maven工程的核心配置文件
在这里插入图片描述

为什么要遵守约定的目录结构呢?

  • Maven 要负责我们这个项目的自动化构建,以编译为例,Maven 要想自动进行编译,那么它必须知道Java源文件保存在哪里。
  • 如果我们自己自定义的东西想要让框架或工具知道,有两种办法
    [1]以配置的方式明确告诉框架
<param-value>classpath:spring-context.xml</param-value>

[2]遵守框架内部已经存在的约定

log4j.properties
log4j.xml

4.3.坐标
Maven 的坐标
使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。
[1]groupid:公司或组织的域名倒序+当前项目名称
[2]artifactId:当前项目的模块名称
[3]version:当前模块的版本

  <groupId>com.atguigu.maven</groupId>
  <artifactId>Hello</artifactId>
  <version>0.0.1-SNAPSHOT</version>

如何通过坐标到仓库中查找 jar 包?
[1]将 gav 三个向量连起来

com.atguigu.maven+Hello+0.0.1-SNAPSHOT

[2]以连起来的字符串作为目录结构到仓库中查找

com/atguigu/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar

注意:我们自己的 Maven 工程必须执行安装操作才会进入仓库。安装的命令是:

mvn install

4.4.依赖管理
Maven 中最关键的部分,我们使用 Maven 最主要的就是使用它的依赖管理功能。要理解和掌握 Maven 的依赖管理,我们只需要解决一下几个问题:
①依赖的目的是什么
当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。那么如何在项目
中以依赖的方式引入一个我们需要的 jar 包呢?
答案非常简单,就是使用 dependency 标签指定被依赖 jar 包的坐标就可以了。

<dependency>
  <groupId>com.atguigu.maven</groupId>
  <artifactId>Hello</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>

②依赖的范围
大家注意到上面的依赖信息中除了目标 jar 包的坐标还有一个 scope 设置,这是依赖的范围。依赖的范
围有几个可选值,我们用得到的是:compile、test、provided 三个。
在这里插入图片描述

③依赖的传递性
A 依赖 B,B 依赖 C,A 能否使用 C 呢?那要看 B 依赖 C 的范围是不是 compile,如果是则可用,否则不可用。
在这里插入图片描述

④依赖的排除
如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当前工程,但是个别情况下 B 有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入 A 的时候将 B 排除。
配置方式

<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

⑤统一管理所依赖 jar 包的版本
对同一个框架的一组 jar 包最好使用相同的版本。为了方便升级框架,可以将 jar 包的版本信息统一提取出来
[1]统一声明版本号

<properties>
<atguigu.spring.version>4.1.1.RELEASE</atguigu.spring.version>
</properties>

其中 atguigu.spring.version 部分是自定义标签。
[2]引用前面声明的版本号

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${atguigu.spring.version}</version>
</dependency>
……
</dependencies>

[3]其他用法

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

⑥依赖的原则:解决 jar 包冲突
[1]路径最短者优先
[2]路径相同时先声明者优先
这里“声明”的先后顺序指的是 dependency 标签配置的先后顺序。

4.5.仓库管理
①分类
[1]本地仓库:为当前本机电脑上的所有 Maven 工程服务。
[2]远程仓库
(1)私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务。
(2)中央仓库:架设在 Internet 上,为全世界所有 Maven 工程服务。
(3)中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
②仓库中的文件
[1]Maven 的插件
[2]我们自己开发的项目的模块
[3]第三方框架或工具的 jar 包
注:不管是什么样的 jar 包,在仓库中都是按照坐标生成目录结构,所以可以通过统一的方式查询或依赖。

4.6.生命周期
4.7.插件和目标

  • Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
  • 每个插件都能实现多个功能,每个功能就是一个插件目标。
  • Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
    例如:compile 就是插件 maven-compiler-plugin 的一个目标;pre-clean 是插件 maven-clean-plugin 的一个目标。

4.8.继承
①为什么需要继承机制?
由于非 compile 范围的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置。
如果项目需要将各个模块的junit版本统一为4.9,那么到各个工程中手动修改无疑是非常不可取的。
使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。
②创建父工程
创建父工程和创建一般的 Java 工程操作一致,唯一需要注意的是:打包方式处要设置为 pom。
③在子工程中引用父工程

<parent>
<!-- 父工程坐标 -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<relativePath>从当前目录到父项目的 pom.xml 文件的相对路径</relativePath>
</parent>
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 指定从当前子工程的pom.xml文件出发,查找父工程的pom.xml的路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>

此时如果子工程的 groupId 和 version 如果和父工程重复则可以删除。
④在父工程中管理依赖
将 Parent 项目中的 dependencies 标签,用 dependencyManagement 标签括起来

<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>

在子项目中重新指定需要的依赖,删除范围和版本号

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>

4.9.聚合
①为什么要使用聚合?
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行 clean 操作。而使用了聚合之后就可以批量进行 Maven 工程的安装、清理工作。
②如何配置聚合?
在总的聚合工程中使用 modules/module 标签组合,指定模块工程的相对路径即可

<modules>
<module>../Hello1</module>
<module>../Hello2</module>
<module>../Hello3</module>
</modules>

5.常用maven命令
①注意:执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录
②常用命令:
mvn clean:清理
mvn compile:编译主程序
mvn test-compile:编译测试程序
mvn test:执行测试
mvn package:打包
mvn install:安装
mvn site:生成站点

6.关于联网问题
①Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中。
②当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。
③本地仓库的默认位置:[系统中当前用户的家目录].m2\ repository
④Maven核心程序如果在本地仓库中找不到需要的插件,"那么它会自动连接外网,到中央仓库下载。
⑤如果此时无法连接外网,则构建失败。
⑥修改默认本地仓库的位置可以让Maven核心程序到我们自己设置好的目录下查找插件
[1]找到Maven解压目录\conf\settings.xml
[2]在settings.xml文件中找到localRepository标签
[3]将/path/to/local/repo</loca alRepository>从注释中取出
[4]将标签体内容修改为已经准备好的Maven仓库目录

目标路径
7.Maven依赖库:http://mvnrepository.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值